无法操纵pandas数据帧

时间:2016-11-15 19:54:22

标签: python pandas

我偶尔会发送一个包含许多N / A值的数据框。

enter image description here

在这些情况下,存在reduntant行。对于每个X值,只有一个Y值。因此,我想将两个“example1”行合并为一行(如图所示),方法是将“context”列与测量列名称(M1,M2,.. Mn)合并。

如何使用pandas数据帧功能实现这一目标?

感谢。

2 个答案:

答案 0 :(得分:1)

df = pd.DataFrame(
    [
        ['a', .1, np.nan, np.nan, .5],
        ['b', np.nan, .2, .3, .5],
    ],
    ['example1', 'example1'],
    ['context', 'M1', 'M2', 'M3', 'Y']
)

d1 = df.set_index('context', append=True).stack().unstack([1, 2])

d1.columns = d1.columns.map('_'.join)

d1

enter image description here

答案 1 :(得分:1)

您可以使用加入。它接收rsuffixlsuffix参数,因此使用它们会更容易,但如果您需要使用前缀,则可以手动更改它。

创建您的DataFrame

df = pd.DataFrame({'X':['example1', 'example1'], 'context':['a',  'b'], 'M1':[0.1, np.nan], 'M2':[np.nan,0.2], 'M3':[np.nan, 0.3], 'Y':[0.5, 0.5]}, columns=['X', 'context', 'M1', 'M2', 'M3', 'Y'])

解决方案

dfa = df[df['context'] == 'a'].set_index(['X', 'Y']).drop('context', axis=1)
dfb = df[df['context'] == 'b'].set_index(['X', 'Y']).drop('context', axis=1)

dfa.join(dfb, how='left', lsuffix='_a', rsuffix='_b').dropna(axis=1)