通过列值扩展数据框

时间:2019-01-23 11:12:24

标签: python python-3.x pandas

可以说我有一个格式为df的数据帧:我只显示了id = 1,但有几个id值。

  Email       id    Product   Value
x@gmail.com    1      p_1       1
y@gmail.com    1      p_2       2
z@gmail.com    1      p_3       3
t@gmail.com    1      p_4       4

现在我需要以下格式的结果:

  Email       id    Product   Value  Product_n   Value_n
x@gmail.com    1      p_1       1        p_2        2
x@gmail.com    1      p_1       1        p_3        3
x@gmail.com    1      p_1       1        p_4        4
y@gmail.com    1      p_2       2        p_1        1
y@gmail.com    1      p_2       2        p_3        3
y@gmail.com    1      p_2       2        p_4        4   ....so on

我接受特定Product的{​​{1}}中的每个项目,然后用其余的id项创建两个新列。

我通过使用Product循环进行了相同的尝试,但是对于每个for大约有1000个id值和9个Product项目,这花费了我很多时间。我们可以使过程更快吗?

id

1 个答案:

答案 0 :(得分:1)

尝试一下

temp=df[['Product','Value']]
temp_df=pd.DataFrame()
for val in temp['Product'].unique().tolist():
    temp_df=pd.concat([temp_df,temp.copy().assign(key=val)])
df= pd.merge(df,temp_df,left_on=['Product'],right_on=['key'],how='right')
df=df.rename(columns={'Product_x':'Product','Value_x':'Value','Product_y':'Product_n','Value_y':'Value_n'})
df=df[df['Product']!=df['Product_n']]

说明:

  1. temp仅包含必需的列,temp_df爆炸您的数据框并分配用于合并的键
  2. temp_df包含要执行合并的主df的副本。
  3. 根据产品和密钥正确加入
  4. 清理数据