融化后如何绘制?

时间:2019-03-25 18:35:05

标签: python pandas numpy

使用大熊猫,我加载了一些以“透视”格式获取的数据。因此,我想先取消数据透视,然后再进行一些转换。最值得注意的是对二进制变量进行编码。

我要采取的策略是使用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之前添加新列。

1 个答案:

答案 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