将列值设置为行

2024-06-23 01:09:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个df

df = pd.DataFrame( {"Client" : ["Alice", "Nan", "Nan", "Mallory", "Nan" , "Bob"] , 
    "Product" : ["A", "B", "C", "B", "C", "B"] } )

我想得出这样的结果:

Alice   A, B, C
Mallory B, C
Bob     B

有人知道如何使用Python3实现这一点吗


Tags: clientdataframedfnanproductpython3pdbob
3条回答

像这样的怎么样

import pandas as pd
from collections import defaultdict

df = pd.DataFrame( {"Client" : ["Alice", "Nan", "Nan", "Mallory", "Nan" , "Bob"] , 
    "Product" : ["A", "B", "C", "B", "C", "B"] } )

last_client = None
data = defaultdict(list)
for _, row in df.iterrows():
    # id hazard a guess you want np.nan not the string compare here
    if row.Client != last_client and row.Client != "Nan":
        last_client = row.Client
    data[last_client].append(row.Product)

print(data)

defaultdict(, {'Alice': ['A', 'B', 'C'], 'Mallory': ['B', 'C'], 'Bob': ['B']})

分组后,可以对join项执行agg函数

熊猫0.25+

df = df.replace("Nan",np.NaN).ffill()
df.groupby('Client', sort=False)['Product'].agg(Product=('Product',','.join)).reset_index()

熊猫在0.25以下

df=df.replace("Nan",np.NaN).ffill()
df.groupby('Client', sort=False)['Product'].agg([('Product', ','.join)]).reset_index()

输出

    Client  Product
0   Alice   A,B,C
1   Mallory B,C
2   Bob     B

看起来您拥有groupby操作的输出(数据所在的位置是“Nan”),您需要将其恢复到groupby状态,以便对其执行任何有用的操作

首先将字符串“Nan”转换为实际的Nan

import numpy as np
df.replace("Nan", np.NaN, inplace=True)

那菲尔就可以工作了

df.ffill(axis=0, inplace=True)

然后获取输出的格式:(这里是魔术发生的地方)

for group, data in df.groupby(df.Client): 
    print(group, data.Product.tolist())

Alice ['A', 'B', 'C']
Bob ['B']
Mallory ['B', 'C']

我将把f字符串格式化作为家庭作业

相关问题 更多 >