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
我有这个数据框:
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