pandas如何将两行合并为一行?

How merge two rows in one row in pandas?

我有这个数据框:

    id   type    value
0  104     0       7999
1  105     1  196193579
2  108     0     245744
3  108     1   93310128

我需要合并具有相同 id 的行并将两个值保持在同一行中,以下示例是我的要求:

    id   type    value_0     value_1
0  104     0       7999       0
1  105     1        0      196193579
2  108     0     245744    93310128

我有以下代码,用于分组和更改每一行的值

 def concat_rows(self, rows ):
        row = rows.iloc[0]

        if len(rows) > 1:
            row1 = rows.iloc[0]
            row2 = rows.iloc[1]
            row['value_1'] = row1['value'] if row1['type'] == 1 else row2['value']
            row['value_0'] = row1['value'] if row1['type'] == 0 else row2['value']
        else:

            row['value_1'] = row['value'] if row['type'] == 1 else 0
            row['value_0'] = row['value'] if row['type'] == 0 else 0
        return row

df2 = df.groupby('id').apply(self.concat_rows).reset_index(drop=True)

但我得到以下table修改后的数字

    id  value    type  value_1  value_0
0  104   7999     0        0     7999
1  105     99     1       99      399
2  108  10770     0    12118    10770

数据:

{'id': [104, 105, 108, 108],
 'type': [0, 1, 0, 1],
 'value': [7999, 196193579, 245744, 93310128]}

您可以使用:

df = df.pivot_table(index=['id'], columns=['type'], values=['value'], fill_value=0).reset_index()
df.columns = ['_'.join(map(str, col)).strip('_') for col in df.columns]

OUTPUT

    id   value_0      value_1
0  104    7999.0          0.0
1  105       0.0  196193579.0
2  108  245744.0   93310128.0

您似乎还想保留“类型”列值。因此,您可以使用 groupby + first 来获取“类型”列;然后使用 pivot 获取剩余的列并将其 merge 到“类型”和“id”列:

out = (df.groupby('id')['type'].first().reset_index()
       .merge(df.pivot('id', 'type', 'value').add_prefix('value_')
              .fillna(0).reset_index(), on='id'))

pivot + assign:

out = (df.pivot('id', 'type', 'value')
       .add_prefix('value_').fillna(0)
       .assign(type=df.groupby('id')['type'].first())
       .reset_index()
       [['id','type','value_0','value_1']]
       .rename_axis(columns=[None]))

输出:

    id  type   value_0      value_1
0  104     0    7999.0          0.0
1  105     1       0.0  196193579.0
2  108     0  245744.0   93310128.0