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%
我正在处理一些数据,遇到了以下问题。
在我的 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%