【发布时间】:2018-07-14 04:28:43
【问题描述】:
我有一个关于将数据框从一行中的多列中展平或折叠的问题,其中包含有关键的信息,每行具有相同的键列和适当的数据。假设一个数据框是这样的:
df = pd.DataFrame({'CODE': ['AA', 'BB', 'CC'],
'START_1': ['1990-01-01', '2000-01-01', '2005-01-01'],
'END_1': ['1990-02-14', '2000-03-01', '2005-12-31'],
'MEANING_1': ['SOMETHING', 'OR', 'OTHER'],
'START_2': ['1990-02-15', None, '2006-01-01'],
'END_2': ['1990-06-14', None, '2006-12-31'],
'MEANING_2': ['ELSE', None, 'ANOTHER']})
CODE START_1 END_1 MEANING_1 START_2 END_2 MEANING_2
0 AA 1990-01-01 1990-02-14 SOMETHING 1990-02-15 1990-06-14 ELSE
1 BB 2000-01-01 2000-03-01 OR None None None
2 CC 2005-01-01 2005-12-31 OTHER 2006-01-01 2006-12-31 ANOTHER
我需要把它变成这样的形式:
CODE START END MEANING
0 AA 1990-01-01 1990-02-14 SOMETHING
1 AA 1990-02-15 1990-06-14 ELSE
2 BB 2000-01-01 2000-03-01 OR
3 CC 2005-01-01 2005-12-31 OTHER
4 CC 2006-01-01 2006-12-31 ANOTHER
我有一个解决方案如下:
df_a = df[['CODE', 'START_1', 'END_1', 'MEANING_1']]
df_b = df[['CODE', 'START_2', 'END_2', 'MEANING_2']]
df_a = df_a.rename(index=str, columns={'CODE': 'CODE',
'START_1': 'START',
'END_1': 'END',
'MEANING_1': 'MEANING'})
df_b = df_b.rename(index=str, columns={'CODE': 'CODE',
'START_2': 'START',
'END_2': 'END',
'MEANING_2': 'MEANING'})
df = pd.concat([df_a, df_b], ignore_index=True)
df = df.dropna(axis=0, how='any')
这会产生所需的结果。当然,如果您有超过 2 个需要折叠的列组(我的真实代码中实际上有 6 个),这似乎不是很pythonic,并且显然不理想。我已经检查了groupby()、melt() 和stack() 方法,但还没有真正发现它们非常有用。任何建议将不胜感激。
【问题讨论】:
-
实际上有一些方便的函数,称为 lreshape 和 wide_to_long,但它们都没有得到很好的支持。 lreshape 仍然是“实验性的”,wide_to_long 的参数名称很糟糕,并且有非常具体的输入要求。