首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以熔化数据框,以便根据数据类型单独创建值列?(使用python)

有没有一种方法可以熔化数据框,以便根据数据类型单独创建值列?(使用python)
EN

Stack Overflow用户
提问于 2019-06-11 19:44:24
回答 1查看 249关注 0票数 2

我有一个有数百列的数据帧,要表示成我应用熔化所需的格式,这是不令人满意的。melt函数创建一个值列,并将该列的所有值附加给"value_vars“参数,而与数据类型无关。我正在尝试是否可以根据数据类型获得单独的值列。

我拥有的数据帧:

时间* value2 *

2018年2/4月2:00-11:00,U.K         A、、3、3、3、7、7、3、3、3、8、7、7、7、7、7、8、8、6、8、8、6、5、6、6、5、6、6、6、6、8、8、8、8、8、8、8、8、8、6、8、8、6、8、6、6、6、6、6、6、8、6、6、6、6、6、8、6、6、11、11、11、11、11、11、11、11、11、11、11、11、11、6、6、6、6、6、6、6、6、6、6、6、6、6、6、6、6、6

2018年3/4财年3月4日,U.K         C*6*

2018年4/4月4日,美国银行U.K         B*1*1

2018年5月4日-5/4-11:00-11:00-11:00-6:00-4:00-4:00-4:00-4:00-6:00-4:00-4:00-6:00-6:00-4:00-6:00-6:00-6:00-6:00-6:00-6:00-4:00-4:00-4:00-6:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-4:00-3:00-4:00-4:00-3:00-4:00-4:00-4:00

预期输出:

时间、地点、地点、参数、来源、方法、价值

2/4/18年2月4日,日本: U.K         温度*3

3/4/18年3月4日,日本: U.K         温度*

4/4/18月4日:日本金融市场: U.K         温度:*6

5/4/18年5月4日,三星电子U.K         温度*8*

2/4/18年2:00:30:00:30:00:30:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00:30:00-2:00:30:00-1:00-1:00-2:00-2:00-2:00-2:1-2:1-2:1-2:1-2:1-2:1-

3/4/18年3月4日,日本金融市场对U.K         的压力很大,日本金融市场的压力很大。

4/4/18* U.K         压力*

5/4/18* U.K         压力*

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 19:56:49

DataFrame.select_dtypes用于get columns types、reshape by stack和join by concat

代码语言:javascript
复制
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

select pair和unpair列在前2个cols之后的另一个解决方案:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56542941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档