我有1个数据框,其中Sold-To Country Name
列的某些行在Not: XX XX XX
的值中,这意味着除Sold-To Country Codes
之外的其余XX XX XX
将向映射的Reporting Country
报告。
另一个要求是,如果Sold-To Country Code
是null
(或NaN
),它将捕获该SalesOrg中所有国家/地区代码的所有收入。
df_mapping = pd.DataFrame({'SalesOrg Code':['0001','0002','0002','0002','0002'],
'Reporting Country':['Spain','UK','UK','UK','Netherlands'],
'Sold-To Country Code':[np.nan,'IE','FR','IT','Ex:'],
'Sold-To Country Name':[np.nan,'Ireland','France','Italy','NOT: FR IE IT']})
SalesOrg Code Reporting Country Sold-To Country Code Sold-To Country Name
0001 Spain null null
0002 UK IE Ireland
0002 UK FR France
0002 UK IT Italy
0002 Netherlands Ex: NOT: FR IE IT
.......
将会有另一个带有全球国家代码完整列表的数据框,我们可以在其中搜索其余的国家代码。
数据框示例:
df_countrylist = pd.DataFrame(["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR",
"AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE",
"BZ", "BJ", "BM", "BT", "BO", "BQ", "BA", "BW", "BV", "BR", "IO",
"BN", "BG", "BF", "BI", "CV", "KH", "CM", "CA", "KY", "CF", "TD",
"CL", "CN", "CX", "CC", "CO", "KM", "CG", "CD", "CK", "CR", "CI",
"HR", "CU", "CW", "CY", "CZ", "DK", "DJ", "DM", "DO", "EC", "EG",
"SV", "GQ", "ER", "EE", "ET", "FK", "FO", "FJ", "FI", "FR", "GF",
"PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD",
"GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "VA", "HN",
"HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT",
"JM", "JP", "JE", "JO", "KZ", "KE", "KI", "KP", "KR", "KW", "KG",
"LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MK",
"MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT",
"MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA",
"NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MP",
"NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN",
"PL", "PT", "PR", "QA", "RE", "RO", "RU", "RW", "BL", "SH", "KN",
"LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC",
"SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "SS", "ES",
"LK", "SD", "SR", "SJ", "SZ", "SE", "CH", "SY", "TW", "TJ", "TZ",
"TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV",
"UG", "UA", "AE", "GB", "US", "UM", "UY", "UZ", "VU", "VE", "VN",
"VG", "VI", "WF", "EH", "YE", "ZM", "ZW"])
最终,我想要这样:
SalesOrg Code Reporting Country Sold-To Country Code Sold-To Country Name
0001 Spain null (all) null
0002 UK IE Ireland
0002 UK FR France
0002 UK IT Italy
0002 Netherlands AT Austria
0002 Netherlands DK Denmark
0002 Netherlands NL Netherlands
0002 Netherlands BE Belgium
0002 Netherlands LT Lithuania
0002 Netherlands LX Latvia
.......
对于SalesOrg#0002,如果
Sold-To Country Code
不是FR IE IT
,其余的将报告给荷兰。因此,我想为其余国家/地区代码创建行。有没有更好的方法来创建行并扩展到现有的Dataframe中?
最佳答案
检查是否可以得到您想要的东西。
df1['a'] = df1['Sold-To Name'].replace(regex=r'NOT:', value='').str.split(" ")
df1['a']= df1['a'].apply (lambda x : (np.setdiff1d(c_list,x)))
df1.loc[ df1['Sold-To Code']== 'Ex:', 'Sold-To Code' ] = df1['a']
df1=df1.explode('Sold-To Code')
df1.drop('a',axis=1,inplace=True)
细节
df1['a'] = df1['Sold-To Name'].replace(regex=r'NOT:', value='').str.split(" ")
这样,我们将创建一个新列
a
,复制列Sold-To Name
的内容,删除测试“ NOT:”,将其余内容拆分为一个列表df1['a']= df1['a'].apply (lambda x : (np.setdiff1d(c_list,x)))
这样,我们将
a
中每行的内容与contries列表进行比较(c_list应该是一个列表,而不是像您这样的数据框)。df1.loc[ df1['Sold-To Code']== 'Ex:', 'Sold-To Code' ] = df1['a']
这样,我们将值的
Sold-To Code
列的行替换为a
列的内容(这是Sold-To Name
中的国家/地区以外的国家/地区的列表)df1=df1.explode('Sold-To Code')
在pandas 0.25中,我们有
pandas.DataFrame.explode
可用于将列列表中的每个项目制作为单独的行(其余列将照原样复制)df1.drop('a',axis=1,inplace=True)
我们删除列
a
,因为我们不再需要它。它对我来说很好,请检查您的终端并查看它是否也对您有效。
关于python - 如何通过“排除”条件创建行并扩展到现有的数据框?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57603199/