有没有一种方法可以融化数据框架,以便根据数据类型分别创建values列? (使用python)

时间:2019-06-11 11:44:23

标签: python python-3.x pandas dataframe pandas-groupby

我有一个具有数百列的数据框,要通过融化将其表示为所需格式,这是不能令人满意的。 melt函数将创建一个value列,并将该列的所有值附加到“ value_vars”参数,而与数据类型无关。 我正在尝试是否可以根据数据类型获取单独的值列。

我拥有的数据框:

时间位置温度温度值1压力值2

2018年2月4日英国A A 3 3 C 2

3/4/2018英国C 4 4 D 6

4/4/2018英国B B 6 6 A 1

5/4/2018英国D D 8 8 A 4

预期输出:

时间地点参数参数来源值

2/4/18英国温度A 3 3

3/4/18英国温度温度C

4

4/4/18英国温度B 6 6

5/4/18英国英国温度D D 8 8

2/4/18英国压力C <2

3/4/18英国压力D D 6

4/4/18英国压力A(A)1

5/4/18英国压力A A 4

谢谢。

1 个答案:

答案 0 :(得分:0)

使用DataFrame.select_dtypes来获取类型的列,使用JSON.parse进行整形并使用stack进行连接:

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
相关问题