我有1个数据框,其中Sold-To Country Name列的某些行在Not: XX XX XX的值中,这意味着除Sold-To Country Codes之外的其余XX XX XX将向映射的Reporting Country报告。

另一个要求是,如果Sold-To Country Codenull(或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/

10-12 22:19