使用Pandas组合数据框中两行的不同部分
我有一个像下方的大(> 10000行)数据帧,我必须由行具有相同名称结合COL_1,COL_2,col_3的基团的和col_4,col_5的组b或c组(b&Ç不会同时存在)。
我可以在网上找到如何组合(相加)每一列的行,而不是放在不同的部分。
原始数据框
| 姓名 | 团体 | col_1 | col_2 | col_3 | col_4 | col_5 |
|---|---|---|---|---|---|---|
| 安 | 一种 | 1 | NaN | 2 | 3 | NaN |
| 安 | 乙 | 1 | NaN | NaN | 2 | 3 |
| 本 | 一种 | 0 | 1 | 2 | 1 | NaN |
| 本 | C | 0 | NaN | NaN | 3 | NaN |
| 猫 | 一种 | 2 | 3 | NaN | NaN | NaN |
回答
一个特设的方法的位,但你可以做到这一点的一种方式是通过名称和组排序的数据帧,然后分割你的df分为两个部分(即COL1 / 2/3组),执行groupby和使用first()上第一个df和last()第二个,然后使用concat以下方法重新组合在一起:
import pandas as pd
df.sort_values(['name','group'],ascending=True,inplace=True)
one = df.iloc[:,:5]
two = pd.concat([df.iloc[:,:2],df[['col_4','col_5']]],axis=1)
def my_func(df1,df2,col):
return pd.concat([df1.groupby(col).first(),
df2.groupby(col).last()],
axis=1).drop('group',axis=1)
res = my_func(one,two,'name')
哪个打印:
print(res)
col_1 col_2 col_3 col_4 col_5
name
ann 1 NaN 2.00 2.00 3.00
ben 0 1.00 2.00 3.00 NaN
cat 2 3.00 NaN NaN NaN
如果我没记错的话,这可以满足您的需求。