根据行名向 pandas 数据框添加一列,如果行不存在,则将其添加到
add a column to pandas dataframe based on row name, if row doesnt exist add it in
我有以下数据框,df1 是我的主人
df1 = pd.DataFrame([['a', '10'], ['b', '20']],
columns=['letter', 'Jan'])
df2 = pd.DataFrame([['a', '1'], ['b', '2'], ['c', '2']],
columns=['letter', 'feb'])
df3 = pd.DataFrame([['a', '10'], ['b', '20'], ['c', '20'], ['d', '20']],
columns=['letter', 'march'])
如何将 df2 然后 df3 添加到 df1,使其看起来如下所示。
Letter jan feb march
0 a 10 1 10
1 b 20 2 20
2 c 2 20
3 d 20
res = pd.concat([df1, df2,df3])
我厌倦了这个,而且不断添加信件,这不是我想要的
letter Jan feb march
0 a 10 NaN NaN
1 b 20 NaN NaN
0 a NaN 1 NaN
1 b NaN 2 NaN
2 c NaN 2 NaN
0 a NaN NaN 10
1 b NaN NaN 20
2 c NaN NaN 20
3 d NaN NaN 20
知道如何解决这个问题吗?
谢谢
使用DataFrame.merge
to outer merge the dataframes df1
, df2
and df3
on letter
then use DataFrame.fillna
填充NaN
值:
df = (
df1.merge(df2, on='letter', how='outer')
.merge(df3, on='letter', how='outer').fillna('')
)
或者,如果有大量需要合并的数据帧,我们可以使用 reduce
+ pd.merge
使用更简洁的解决方案,并将需要合并的数据帧列表传递给 reduce
函数:
from functools import reduce
df = reduce(lambda x, y:
pd.merge(x, y, on='letter', how='outer'), [df1, df2, df3]).fillna('')
结果:
# print(df)
letter Jan feb march
0 a 10 1 10
1 b 20 2 20
2 c 2 20
3 d 20
这是您问题的解决方案。
df_outer = pd.merge(df1, df2, on='letter', how='outer')
df_outer = pd.merge(df_outer, df3, on='letter', how='outer')
df_outer = df_outer.fillna('')
df_outer
我有以下数据框,df1 是我的主人
df1 = pd.DataFrame([['a', '10'], ['b', '20']],
columns=['letter', 'Jan'])
df2 = pd.DataFrame([['a', '1'], ['b', '2'], ['c', '2']],
columns=['letter', 'feb'])
df3 = pd.DataFrame([['a', '10'], ['b', '20'], ['c', '20'], ['d', '20']],
columns=['letter', 'march'])
如何将 df2 然后 df3 添加到 df1,使其看起来如下所示。
Letter jan feb march
0 a 10 1 10
1 b 20 2 20
2 c 2 20
3 d 20
res = pd.concat([df1, df2,df3])
我厌倦了这个,而且不断添加信件,这不是我想要的
letter Jan feb march
0 a 10 NaN NaN
1 b 20 NaN NaN
0 a NaN 1 NaN
1 b NaN 2 NaN
2 c NaN 2 NaN
0 a NaN NaN 10
1 b NaN NaN 20
2 c NaN NaN 20
3 d NaN NaN 20
知道如何解决这个问题吗? 谢谢
使用DataFrame.merge
to outer merge the dataframes df1
, df2
and df3
on letter
then use DataFrame.fillna
填充NaN
值:
df = (
df1.merge(df2, on='letter', how='outer')
.merge(df3, on='letter', how='outer').fillna('')
)
或者,如果有大量需要合并的数据帧,我们可以使用 reduce
+ pd.merge
使用更简洁的解决方案,并将需要合并的数据帧列表传递给 reduce
函数:
from functools import reduce
df = reduce(lambda x, y:
pd.merge(x, y, on='letter', how='outer'), [df1, df2, df3]).fillna('')
结果:
# print(df)
letter Jan feb march
0 a 10 1 10
1 b 20 2 20
2 c 2 20
3 d 20
这是您问题的解决方案。
df_outer = pd.merge(df1, df2, on='letter', how='outer')
df_outer = pd.merge(df_outer, df3, on='letter', how='outer')
df_outer = df_outer.fillna('')
df_outer