Python 熊猫:合并具有相同索引的行,同时创建新列

Python 熊猫:合并具有相同索引的行,同时创建新列,python,pandas,Python,Pandas,我刚开始使用Pandas,有一个数据框,包含多个具有相同索引的行,表示变量具有某些特性,例如 ItemID Property Numerical_value A1 'Red' 10 A1 'Fruit' 0 B1 'Red' 25 C1 'Liquid' 0 我的数据的假设如下:; 只有属性为“红色”的行具有数值。及 如果一个项目有“水果”属性,它也

我刚开始使用Pandas,有一个数据框,包含多个具有相同索引的行,表示变量具有某些特性,例如

ItemID       Property    Numerical_value
A1           'Red'       10     
A1           'Fruit'     0
B1           'Red'       25
C1           'Liquid'    0
我的数据的假设如下:; 只有属性为“红色”的行具有数值。及 如果一个项目有“水果”属性,它也有红色属性

我面临的问题是转换这个日期框,使其对每个itemID都遵循一个热编码方案,同时也保存数值(如果存在),例如

ItemID       Red&Fruit   Just_red  Other  Numerical_value
A1           1           0         0      10         
B1           0           1         0      25
C1           0           0         1      0
目前,我已经编写了以下代码

def read_report:
    fp = 'file_path'
    df = (pd.read_csv(fp))
    group = df.groupby('ItemID')['Property','Numerical_value'].apply(test_function)

这似乎不是最优的,尤其是获取每个汇总行的数值的方法感觉相当粗糙


有没有更好的方法达到同样的效果?

我建议按组获取属性集:

df.groupby('ItemID')['Property'].apply(set)
Out[15]: 
ItemID
A1    {'Red', 'Fruit'}
B1             {'Red'}
C1          {'Liquid'}
然后,您可以使用
get\u dummies

 df.groupby('ItemID')['Property'].apply(set).str.get_dummies()
Out[17]: 
        {"'Liquid'"}  {"'Red'", "'Fruit'"}  {"'Red'"}
ItemID                                               
A1                 0                     1          0
B1                 0                     0          1
C1                 1                     0          0
在您的示例中,您只需要重命名列。但是,您可能希望
替换
groupby
操作后的值

最后,与数值合并:

pd.concat([df.groupby('ItemID')['Property'].apply(set).str.get_dummies(),
           df.groupby('ItemID')['Numerical_value'].first()], axis=1)
Out[21]: 
        {"'Liquid'"}  {"'Red'", "'Fruit'"}  {"'Red'"}  Numerical_value
ItemID                                                                
A1                 0                     1          0               10
B1                 0                     0          1               25
C1                 1                     0          0                0

这里我采用第一个数值,如您的示例所示。

我建议按组获取属性集:

df.groupby('ItemID')['Property'].apply(set)
Out[15]: 
ItemID
A1    {'Red', 'Fruit'}
B1             {'Red'}
C1          {'Liquid'}
然后,您可以使用
get\u dummies

 df.groupby('ItemID')['Property'].apply(set).str.get_dummies()
Out[17]: 
        {"'Liquid'"}  {"'Red'", "'Fruit'"}  {"'Red'"}
ItemID                                               
A1                 0                     1          0
B1                 0                     0          1
C1                 1                     0          0
在您的示例中,您只需要重命名列。但是,您可能希望
替换
groupby
操作后的值

最后,与数值合并:

pd.concat([df.groupby('ItemID')['Property'].apply(set).str.get_dummies(),
           df.groupby('ItemID')['Numerical_value'].first()], axis=1)
Out[21]: 
        {"'Liquid'"}  {"'Red'", "'Fruit'"}  {"'Red'"}  Numerical_value
ItemID                                                                
A1                 0                     1          0               10
B1                 0                     0          1               25
C1                 1                     0          0                0

这里我以第一个数值为例。

您的问题对我来说并不完全清楚:根据您的说法,在第1组中,您有一个项目“红色”和一个项目“水果”,即“红色和水果”。这两个物体是不同的吗?或者任何时候有一个“水果”也会有一个“红色”?你的最后一句话是正确的,它是同一个对象。如果我们遇到“水果”属性,我们确信它也有“红色”属性。我不完全清楚您的问题:在第1组中,您有一个项目“红色”和一个项目“水果”,根据您的说法,这是“红色和水果”。这两个物体是不同的吗?或者任何时候有一个“水果”也会有一个“红色”?你的最后一句话是正确的,它是同一个对象。如果我们遇到“水果”属性,我们确信它也有“红色”属性。