如何从在其他列中具有相同对应值的现有行值创建新列? (熊猫)

时间:2021-06-10 07:39:59

标签: python pandas

对不起,如果标题没有多大意义。

我有一个大 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 行,所以很多解决方案都会给我带来内存错误。

4 个答案:

答案 0 :(得分:1)

groupby 是一个很好的解决方案。使用 GroupByagg 对象转换为列表。最后,您可以使用输入列表创建一个新的数据框。

>>> 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")

相关问题