【问题标题】:python (pandas) merge within dataframe without for looppython(熊猫)在没有for循环的数据框中合并
【发布时间】:2023-03-11 22:01:01
【问题描述】:

您好,我有以下数据框:

>df1
    code    item01  item02  item03  item04  item05
0   1111    nan nan nan nan 440
1   1111    nan nan nan 650 nan
2   1111    nan nan nan nan nan
3   1111    nan nan nan nan nan
4   1111    32  nan nan nan nan
5   1111    nan nan nan nan nan
6   1111    nan nan nan nan nan
7   1111    nan nan nan nan nan
8   1111    nan nan nan nan nan
9   1111    nan nan nan nan nan
10  1111    nan nan nan nan nan
11  2222    20  nan nan nan nan
12  2222    nan nan nan nan nan
13  2222    nan nan nan 5   nan
14  2222    nan 7   nan nan nan
15  2222    nan nan nan nan nan
16  2222    nan nan nan nan nan

如何使用数据框中的“代码”列进行合并,以在没有 for 循环或 iterrows() 的情况下获得 df2。

>df2
    code    item01  item02  item03  item04  item05
0   1111    32  130 nan 650 440
1   2222    20  7   nan 5   nan

【问题讨论】:

  • 每组只有一个非 nan 值?如果是,df.groupby('code').first() 应该可以工作。

标签: python python-3.x pandas dataframe merge


【解决方案1】:

你可以使用:

如果每组的列中最多只有一个非值:

df.groupby('code').first()

如果可能有多个值 - 更通用的解决方案:

cols = df.columns.difference(['code'])
df = df.groupby('code')[cols]
       .apply(lambda x: x.apply(lambda y: pd.Series(y.dropna().values)))
print (df)
        item01  item02  item03  item04  item05
code                                          
1111 0    32.0     NaN     NaN   650.0   440.0
2222 0    20.0     7.0     NaN     5.0     NaN

【讨论】:

  • 它做到了!谢谢,杰斯瑞尔
【解决方案2】:

您可以简单地使用 groupby:

df1.groupby('code').max().reset_index(drop=True,inplace=True)

注意,如果一个项目有很多相同代码的值,这里你会保留最大的。

reset_index仅用于获取相同格式的Output DataFrame。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多