[英]Python 3: Transpose columns of Pandas Data Frame / "melt" data frame
[英]Is there a way to melt a data frame such that values columns are created separately on the basis of data type? (using python)
我有一个包含数百列的数据框,要通过融化将其表示为所需格式,这是不令人满意的。 melt函数将创建一个value列,并将该列的所有值附加到“ value_vars”参数,而与数据类型无关。 我正在尝试是否可以根据数据类型获取单独的值列。
我有的数据帧:
时间地点温度值1压力值2
2/4/2018英国A 3 C 2
3/4/2018英国C 4 D 6
4/4/2018英国B 6 A 1
5/4/2018英国D 8 A 4
预期产量:
时间地点参数源值
18/2/4/18英国温度A 3
3/4/18英国温度C 4
18/4/4英国温度B 6
18/5/4英国温度D 8
18/2/4/18英国压力C 2
3/4/18英国压力D 6
18/4/4 /英国压力A 1
18/5/4英国压力A 4
提前致谢。
使用DataFrame.select_dtypes
按类型获取列,按stack
DataFrame.select_dtypes
,并按concat
:
df = df.reset_index(drop=True)
df1 = df.set_index(['time','place'], append=True)
a = df1.select_dtypes(object).stack().rename('source').reset_index(level=3)
b = df1.select_dtypes(np.number).stack().rename('value').reset_index(level=3, drop=True)
df2 = (pd.concat([a, b], axis=1)
.reset_index(level=[1,2])
.rename(columns={'level_3':'parameter'})
.sort_values(['place','parameter'])
.reset_index(drop=True)
)
print (df2)
time place parameter source value
0 2/4/2018 U.K Pressure C 2
1 3/4/2018 U.K Pressure D 6
2 4/4/2018 U.K Pressure A 1
3 5/4/2018 U.K Pressure A 4
4 2/4/2018 U.K Temperature A 3
5 3/4/2018 U.K Temperature C 4
6 4/4/2018 U.K Temperature B 6
7 5/4/2018 U.K Temperature D 8
前两个列之后选择配对和取消配对列的另一种解决方案:
df = df.reset_index(drop=True)
df1 = df.set_index(['time','place'], append=True)
a = df1.iloc[:, ::2].stack().rename('source').reset_index(level=3)
b = df1.iloc[:, 1::2].stack().rename('value').reset_index(level=3, drop=True)
df2 = (pd.concat([a, b], axis=1)
.reset_index(level=[1,2])
.rename(columns={'level_3':'parameter'})
.sort_values(['place','parameter'])
.reset_index(drop=True)
)
print (df2)
time place parameter source value
0 2/4/2018 U.K Pressure C 2
1 3/4/2018 U.K Pressure D 6
2 4/4/2018 U.K Pressure A 1
3 5/4/2018 U.K Pressure A 4
4 2/4/2018 U.K Temperature A 3
5 3/4/2018 U.K Temperature C 4
6 4/4/2018 U.K Temperature B 6
7 5/4/2018 U.K Temperature D 8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.