gpt4 book ai didi

python - 如何通过 'Exclude' 条件创建行并扩展到现有的 Dataframe 中?

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:25 25 4
gpt4 key购买 nike

我有 1 个 Dataframe,其中一些行的 Sold-To Country Name 列的值是 Not: XX XX XX,这意味着 Sold 的其余部分- 国家/地区代码(XX XX XX 除外)将向映射的报告国家/地区 进行报告。

另一个要求是,如果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,如果售达国家/地区代码 不是 FR IE IT,则其余部分将向荷兰报告。所以我想为其余的国家/地区代码创建行。

有没有更好的方法来创建行并扩展到现有的数据框?

最佳答案

检查这是否能满足您的需求。

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 的行值为“Ex:”的列将其替换为列 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 - 如何通过 'Exclude' 条件创建行并扩展到现有的 Dataframe 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57603199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com