Pandas:将一行的多列连接到多行(1:n)

时间:2018-03-18 22:49:51

标签: python pandas dataframe

我有一个包含许多键/值列的数据框,而键和值是分开的列。

import pandas as pd

values = [['John', 'somekey1', 'somevalue1', 'somekey2', 'somevalue2']]
df = pd.DataFrame(values, columns=['name', 'key1', 'value1', 'key2', 'value2'])

备注:原始数据将包含更多前面的列,而不仅仅是名称。它只有两个键/值列。

我想要实现的是这样的结果:

values = [
    ['John', 'somekey1', 'somevalue1'],
    ['John', 'somekey2', 'somevalue2']
]
df = pd.DataFrame(values, columns=['name', 'key', 'value'])

在那里,我想将所有键/值列连接到列表或字典中,而不是爆炸该列表/字典。我在 pd.melt 上找到this nice posting,但我的问题是,我不知道前面的确切id_var列。因此,我尝试了 pd.Series.stack ,它为键/值列提供了正确的结果,但缺少原始数据中的其他列。任何的想法?这是我试过的:

# generates: [(somekey1, somevalue1), (somekey2, somevalue2)]
df['pairs'] = df.apply(lambda row: [(row['key1'],row['value1']), (row['key2'], row['value2'])], axis=1)
# unstacks the list, but drops all other columns
df['pairs'].apply(pd.Series).stack().reset_index(drop=True).to_frame('pairs')

2 个答案:

答案 0 :(得分:5)

IIUC wide_to_long

pd.wide_to_long(df,['key','value'],i='name',j='drop').reset_index().drop('drop',1)
Out[199]: 
   name       key       value
0  John  somekey1  somevalue1
1  John  somekey2  somevalue2

答案 1 :(得分:3)

以下是我的想法:

common = ['name'] # Add more columns, if needed
# Alternatively:
common = df.loc[:, :'name'].columns # Everything up to 'name'
result = pd.concat([df.loc[:, common + ['key1', 'value1']],
                    df.loc[:, common + ['key2', 'value2']]])

result['key'] = np.where(result['key1'].isnull(),
                         result['key2'], result['key1'])
result['value'] = np.where(result['value1'].isnull(),
                           result['value2'], result['value1'])
result.drop(['value1', 'value2', 'key1', 'key2'], axis=1, inplace=True)
#   name       key       value
#0  John  somekey1  somevalue1
#0  John  somekey2  somevalue2