Python Pandas - 将每个键和值映射到唯一列

Python Pandas - Map each key & value to a unique column

我正在处理一些数据,遇到了以下问题。

在我的 CSV 文件中(我通读了 pandas)我有一个名为效果的列。效果如下所示:

       effects
Row 1: Euphoric 52% Creative 42% Happy 40% ...
Row 2: Relaxed 95% Happy 90% Euphoric 60% ...
Row 3: Happy 64% Uplifted 48% Relaxed 48% ...

等等等等。现在有另一个名为 name 的列,如下所示:

       name
Row 1: Tommy
Row 2: Susan
Row 3: Bruce

我想做的是将效果列中的每个 key/value 映射到与其适当名称相对应的唯一列。

所以基本上它看起来像这样:

       name  euphoric  creative   happy
Row 1: Tommy  52%       42%        40%
Row 2: Susan  60%       n/a        90%
Row 3: Bruce  n/a       n/a        64%

因此您可以看到每个效果及其相应的百分比成为每个名称的唯一列(如果数据不存在,则为 n/a 或空)。

我假设答案可能包括将效果对象转换为字典列表,也许还有一些 excel 文本到顶部的列操作以使映射更容易,但我无法做到成功。

如有任何帮助,我们将不胜感激。

您可以这样使用 str.extract

df[['name']].join(df.effects.str.extractall('(\w+) (\d+\%)')
                    .reset_index()
                    .pivot(index='level_0', columns=0, values=1)
                 )

输出:

         name Creative Euphoric Happy Relaxed Uplifted
Row 1:  Tommy      42%      52%   40%     NaN      NaN
Row 2:  Susan      NaN      60%   90%     95%      NaN
Row 3:  Bruce      NaN      NaN   64%     48%      48%

另一种使用 for 循环的解决方案如下所示:

effects_data = []

for e in df.effects:
    effects_data.append(
        {
            key: val for key, val in zip(e.split(' ')[0::2], e.split(' ')[1::2])
        }
    )
    
print(df[['name']].join(pd.DataFrame(effects_data)))

结果如下:

    name Euphoric Creative Happy Relaxed Uplifted
0  Tommy      52%      42%   40%     NaN      NaN
1  Susan      60%      NaN   90%     95%      NaN
2  Bruce      NaN      NaN   64%     48%      48%