I have a data frame that looks like this
df = pd.DataFrame([{ 'price': 123, 'name': 'anna', 'amount': 1,'telephone':956},
{ 'price': 7, 'name': 'anna', 'amount': 2,'telephone':956},
{ 'price': 42, 'name': 'bob', 'amount': 30,'telephone':956},
{ 'price': 1, 'name': 'charlie', 'amount': 10,'telephone':956},
{ 'price': 2, 'name': 'charlie', 'amount': 100,'telephone':956}])
print(df)
price name amount telephone
0 123 anna 1 956
1 7 anna 2 956
2 42 bob 30 956
3 1 charlie 10 956
4 2 charlie 100 956
And I would like to have a data frame like the following
name price-name-amount-telephone
anna 1-123-1-956|1-7-2-956
bod 2-42-30-956
charlie 3-1-100-956|3-2-100-956
CodePudding user response:
Use GroupBy.ngroup
for groups numbers, then aggregate columns joined by -
with join by |
:
df.insert(0, 'g', df.groupby('name', sort=False).ngroup() 1)
df = (df.set_index('name')
.astype(str)
.agg('-'.join,1)
.groupby(level=0)
.agg('|'.join)
.reset_index(name='all')
)
print (df)
name all
0 anna 1-123-1-956|1-7-2-956
1 bob 2-42-30-956
2 charlie 3-1-10-956|3-2-100-956