【发布时间】:2018-07-09 19:05:52
【问题描述】:
假设我有以下数据框,其中Y 和Z 在ID 中都是常量:
ID TYPE X Y Z
0 1 A 1 foo 10
1 1 B 2 foo 10
2 2 A 3 bar 20
3 2 B 4 bar 20
4 3 A 5 baz 30
5 3 B 6 baz 30
我想将数据从“长”格式重塑为“宽”格式:
ID XA XB Y Z
0 1 1 2 foo 10
1 2 3 4 bar 20
2 3 5 6 baz 30
但是,如果我使用pandas.DataFrame.pivot():
df_new = df.pivot(index='ID', columns='TYPE')
我会得到Y 和Z 的重复:
X Y Z
TYPE A B A B A B
ID
1 1 2 foo foo 10 10
2 3 4 bar bar 20 20
3 5 6 baz baz 30 30
要获得所需的输出,我可以执行以下操作:
import pandas as pd
df = pd.DataFrame({'ID': [1, 1, 2, 2, 3, 3],
'TYPE': ['A', 'B', 'A', 'B', 'A', 'B'],
'X': [1, 2, 3, 4, 5, 6],
'Y': ['foo', 'foo', 'bar', 'bar', 'baz', 'baz'],
'Z': [10, 10, 20, 20, 30, 30]})
def long_to_wide(df, i, j, varlist):
df_wide = df.pivot(index='ID', columns='TYPE')
df_wide.columns = [''.join(col).strip() for col in df_wide.columns.values]
df_wide.reset_index(inplace=True)
for var in varlist:
if pd.Series.equals(df_wide[var + 'A'], df_wide[var + 'B']):
df_wide.drop((var + 'B'), axis = 1, inplace = True)
else:
raise
# Error handling of some sort...
df_wide = df_wide.rename(columns={var + 'A': var})
return df_wide
df_new = long_to_wide(df, 'ID', 'TYPE', ['Y', 'Z'])
但是,我觉得这一定是不必要的复杂。例如,要在 Stata 中获得所需的输出,可以运行:
reshape wide X, i(ID) j(TYPE)
或
reshape wide X, i(ID Y Z) j(TYPE)
这种情况很常见,因此我认为应该有一个内置的方法来处理它。但是在查看了Pandas 文档和 Stack Overflow 之后,我还没有找到更简单的解决方案。
有吗?
【问题讨论】:
标签: python pandas dataframe stata