我有一个包含多个列的大型数据集,在这些列中的每一列中都有4个单独的列。
为方便起见,Dataframe中的列为US.A,US.B,US.C,BR.A,BR.B,BR.C 现在,如果仅US.B列为空白,则类似地在所有与美国相关的列中均以“-”填充。如果BR.B为空白,则将与BR相关的列中以“-”填充。
为此,我使用Python 3和pandas编写了代码来运行它,但对它的外观并不满意,并想知道是否有更简单的方法来处理此问题。
import pandas as pd
###Splitting the data set
df1 = df.drop(['D','E','F'], axis=1)
df2 = df.drop(['A', 'B','C'], axis=1)
###Now I tackle them individually
df1 = df1.astype(str)
df1 = df1[df1['US.B'].isnull()]
df1 = df1f.fillna(value="-")
df2 = df2.astype(str)
df2 = df2[df2['BR.B'].isnull()]
df2 = df2.fillna(value="-")
merge = pd.concat([df1, df2])
现在我之所以将DataFrame转换为字符串,是因为出于某种原因,在fillna期间带“ Nat”的日期列给我带来麻烦。现在,这里看起来很整洁,但是我要处理一个巨大的数据集,并重复多次以达到结果。
数据:
1 US.A US.B US.C BR.A BR.B BR.C
2 Foo 123 01-01-2018 Foo 324 03-05-2017
3 Bar 124 02-01-2018 Bar 325 04-05-2017
4 Foo 125 03-01-2018
5 Bar 126 04-01-2018 Bar 327 06-05-2017
6 Foo 328 07-05-2017
7 Bar 128 06-01-2018 Bar 400 08-05-2017
8 100 07-01-2018 Foo 330
结果:
1 US.A US.B US.C BR.A BR.B BR.C
2 Foo 123 01-01-2018 Foo 324 03-05-2017
3 Bar 124 02-01-2018 Bar 325 04-05-2017
4 Foo 125 03-01-2018 - - -
5 Bar 126 04-01-2018 Bar 327 06-05-2017
6 - - - Foo 328 07-05-2017
7 Bar 128 06-01-2018 Bar 400 08-05-2017
8 100 07-01-2018 Foo 330
答案 0 :(得分:1)
您可以尝试以下方法:
df_US=df.filter(like='US')
df_BR=df.filter(like='BR')
pd.concat([df_US.mask(df_US['US.B'].isna(),'-'),df_BR.mask(df_BR['BR.B'].isna(),'-')],axis=1)
US.A US.B US.C BR.A BR.B BR.C
0 Foo 123 2018-01-01 00:00:00 Foo 324 2017-05-03 00:00:00
1 Bar 124 2018-01-02 00:00:00 Bar 325 2017-05-04 00:00:00
2 Foo 125 2018-01-03 00:00:00 - - -
3 Bar 126 2018-01-04 00:00:00 Bar 327 2017-05-06 00:00:00
4 - - - Foo 328 2017-05-07 00:00:00
5 Bar 128 2018-01-06 00:00:00 Bar 400 2017-05-08 00:00:00
6 NaN 100 2018-01-07 00:00:00 Foo 330 NaT