我有一个像这样的数据框
import pandas as pd
test = pd.DataFrame(data={"IDX": [0,0,0,1,1,2],
"VAL": [27,5,13,27,24,13]})
IDX VAL
0 0 27
1 0 5
2 0 13
3 1 27
4 1 24
5 2 13
并希望将其展开,以便 IDX 成为列,VAL 成为行名,实际值只是指示该值是否不存在/存在的指示器,如下所示:
out = pd.DataFrame(data={"0": [1, 1, 0, 1],
"1": [0, 0, 1, 1],
"2": [0, 1, 0, 0]}, index=[5, 13, 24, 27])
0 1 2
5 1 0 0
13 1 0 1
24 0 1 0
27 1 1 0
有什么方法可以在不使用 for 循环的情况下有效地完成此操作吗?
最佳答案
使用get_dummies
与最大
:
df = pd.get_dummies(test.set_index('VAL')['IDX'].sort_index()).max(level=0)
print (df)
0 1 2
VAL
5 1 0 0
13 1 0 1
24 0 1 0
27 1 1 0
另一个解决方案 - 创建每个组的列表,然后使用 MultiLabelBinarizer
:
s = test.groupby('VAL')['IDX'].apply(list)
print (s)
VAL
5 [0]
13 [0, 2]
24 [1]
27 [0, 1]
Name: IDX, dtype: object
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(s),columns=mlb.classes_, index=s.index)
print (df)
0 1 2
VAL
5 1 0 0
13 1 0 1
24 0 1 0
27 1 1 0
关于python - Pandas 将 DF 传播到指标 DF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52815779/