使用列名称重整从长到宽

Wil*_*win 7 python numpy reshape pandas

嗨,我在调整我的df时遇到麻烦。

我有:

Netflix     TV      DVD 
   0.1      0.2     0.3
   0.12     0.5     0.15
   0.4      0.6     0.8
            0.5     0.41
            0.41
            0.2 
Run Code Online (Sandbox Code Playgroud)

我想将我的df转换为:

Netflix  [0.1, 0.12, 0.4]
TV       [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] 
DVD      [0.3, 0.15, 0.8, 0.41]
Run Code Online (Sandbox Code Playgroud)

不知道stack()ivot()如何在这种df上工作。任何帮助表示赞赏。

piR*_*red 9

stack

重整数组时,堆栈会丢弃空值

df.stack().groupby(level=1).agg(list)

DVD                 [0.3, 0.15, 0.8, 0.41]
Netflix                   [0.1, 0.12, 0.4]
TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
dtype: object
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 7

删除缺少的值,Series.dropna并在字典理解中转换为Series:

s = pd.Series({x: df[x].dropna().tolist() for x in df.columns})
print (s)
Netflix                   [0.1, 0.12, 0.4]
TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
DVD                 [0.3, 0.15, 0.8, 0.41]
dtype: object
Run Code Online (Sandbox Code Playgroud)

...或在DataFrame.apply

s = df.apply(lambda x: x.dropna().tolist())
print (s)

Netflix                   [0.1, 0.12, 0.4]
TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
DVD                 [0.3, 0.15, 0.8, 0.41]
dtype: object
Run Code Online (Sandbox Code Playgroud)

最后,如果需要2列DataFrame

df1 = s.rename_axis('a').reset_index(name='b')
print (df1)
         a                                b
0  Netflix                 [0.1, 0.12, 0.4]
1       TV  [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
2      DVD           [0.3, 0.15, 0.8, 0.41]
Run Code Online (Sandbox Code Playgroud)