对不起,如果标题没有多大意义。
我有一个大 df 如下:
client referer
IP1 producta
IP2 productb
IP1 productc
IP4 productb
IP5 productd
IP4 producte
IP5 productf
IP5 productg
等等。对于每个“客户”值,有时会有超过 1 个“引用者”值。 我想要一个 df 如下:
client referer1 referer2 referer3 ...
IP1 producta productc
IP2 productb
IP4 productb producte
IP5 productd productf productg
.
.
.
我试过了:
d4 = df2.groupby('client')
什么也没做。
d4 = df2.pivot_table(index=['client'], columns = 'referer'
给出了 DataError:没有要聚合的数字类型。
('client' 和 'referer' 列都是分类的。)
知道我能做什么吗?
编辑 我正在处理 10365152 行,所以很多解决方案都会给我带来内存错误。
答案 0 :(得分:1)
groupby
是一个很好的解决方案。使用 GroupBy
将 agg
对象转换为列表。最后,您可以使用输入列表创建一个新的数据框。
>>> pd.DataFrame(df.groupby("client")["referer"]
.agg(list).tolist()).add_prefix("referer")
referer0 referer1 referer2
0 producta productc None
1 productb None None
2 productb producte None
3 productd productf productg
答案 1 :(得分:0)
我认为您最初的想法很好: d4 = df2.groupby('客户') 然后你创建一个字典,除以客户端: 字典 = dict(tuple(d4 .groupby('client'))) 然后,您可以使用 for 循环或其他方式遍历每个数据帧,并将条件 if dataframe.loc[index, referer] != dataframe.loc[index+1 (or-1), referer],然后创建一个新的列并将 dataframe.loc[index+1 (or-1), referer] 放入其中
答案 2 :(得分:0)
这行得通吗:
df
IP1 producta
IP2 productb
IP1 productc
IP4 productb
IP5 productd
IP4 producte
IP5 productf
IP5 productg
df['ref_count'] = df.groupby('client').cumcount() + 1
df['ref_count'] = df['ref_count'].map(lambda x: 'referer' + str(x) )
df.pivot(index = 'client',columns = 'ref_count', values = 'referer')
df
ref_count client referer1 referer2 referer3
0 IP1 producta productc NaN
1 IP2 productb NaN NaN
2 IP4 productb producte NaN
3 IP5 productd productf productg
如果需要,您可以重命名索引。
答案 3 :(得分:0)
稍微修改过的@Corralien 的解决方案,您不必将所有内容都包装在 DataFrame 中:
df.groupby("client")["referer"].agg(list).apply(pd.Series).add_prefix("referer")