使用大熊猫,我加载了一些以“透视”格式获取的数据。因此,我想先取消数据透视,然后再进行一些转换。最值得注意的是对二进制变量进行编码。
我要采取的策略是使用melt
取消透视,然后通过对旧列之一使用布尔运算符来创建新列。我尝试了以下代码。
import pandas as pd
df = pd.DataFrame([[1,5,10],[2,50,100]],columns=['ID','X1','X2'])
df2 = pd.melt(df
,id_vars=['ID']
,value_vars=['X1','X2']
,var_name='var'
,value_name='value')
df2['ID-bool'] = df.ID == 1
print(df2['ID-bool'])
不幸的是,由于melt
似乎对索引做了一些时髦,因此它给出了意外的结果。数据框中只有第一行和第二行具有布尔值,而行3和4(由melt
创建的行)则具有NaN。
0 True
1 False
2 NaN
3 NaN
Name: ID-bool, dtype: object
我应该怎么做才能获得预期的结果?我不希望在melt
之前添加新列。
答案 0 :(得分:1)
您需要使用df2
而不是df
:
import pandas as pd
df = pd.DataFrame([[1,5,10],[2,50,100]],columns=['ID','X1','X2'])
df2 = pd.melt(df
,id_vars=['ID']
,value_vars=['X1','X2']
,var_name='var'
,value_name='value')
df2['ID-bool'] = df2.ID == 1 # Changed df.ID to df2.ID
print(df2)
ID var value ID-bool
0 1 X1 5 True
1 2 X1 50 False
2 1 X2 10 True
3 2 X2 100 False