我需要将初始列组融化为数据集中的多个目标列,而数据集中没有很好地规范化。 下面是一个示例(来自这个问题的熊猫数据帧重塑/堆叠多个值变量到单独的列中):
des1 des2 des3 interval1 interval2 interval3
value
aaa a b c ##1 ##2 ##3
bbb d e f ##4 ##5 ##6
ccc g h i ##7 ##8 ##9
我试图将其融化为这样的方向:
des interval
value
aaa a ##1
aaa b ##2
aaa c ##3
bbb d ##4
bbb e ##5
bbb f ##6
ccc g ##7
ccc h ##8
ccc i ##9
我希望使用 melt 而不是堆栈来避免手动子集大量数据。 以下是我到目前为止开始的内容:
import pandas as pd
import numpy as np
import fnmatch
column_list = list(df_initial.columns.values)
question_sources = [c for c in fnmatch.filter(column_list, "measure*question*source")]
question_ranks = [c for c in fnmatch.filter(column_list, "measure*rank")]
question_targets = [c for c in fnmatch.filter(column_list, "measure*targeted")]
question_statuses = [c for c in fnmatch.filter(column_list, "measure*status")]
place = [c for c in fnmatch.filter(column_list, "place")]
measure_statuses = [c for c in fnmatch.filter(column_list, "measureInfo_status")]
starter_list = place + measure_statuses
df_gpro_melt_1 = (pd.melt(df_initial, id_vars=starter_list,
value_vars=question_sources, var_name="question_sources",
value_name="question_sources_values"))
是否可以将初始列组合并为多个目标列? 任何建议都非常感谢。
我知道这已经得到了回答,但是:
>>> df
des1 des2 des3 interval1 interval2 interval3
value
aaa a b c ##1 ##2 ##3
bbb d e f ##4 ##5 ##6
ccc g h i ##7 ##8 ##9
>>> pd.wide_to_long(df.reset_index(), ['des', 'interval'], i='value', j='id')
des interval
value id
aaa 1 a ##1
bbb 1 d ##4
ccc 1 g ##7
aaa 2 b ##2
bbb 2 e ##5
ccc 2 h ##8
aaa 3 c ##3
bbb 3 f ##6
ccc 3 i ##9
然后,如果您想摆脱id列,只需使用.reset_index(level=1, drop=True)
即可。
如果您的列遵循示例数据框中的模式,这应该适用于您的示例:
pd.concat((pd.DataFrame({'des':df.iloc[:,i],
'interval':df.iloc[:,i+3]})
for i in range(3)))
如果对不同,则可以使用此模式,但循环访问列表
tuples = [(0,3),(1,4),(2,5)]
pd.concat((pd.DataFrame({'des':df.iloc[:,i],
'interval':df.iloc[:,j]})
for i,j in tuples))
我找到了一种丑陋的方法!
In [12]: pd.DataFrame(
data={'desc': df.values[..., 0:3].ravel(),
'interval':df.values[..., 3:6].ravel()},
index = pd.np.ravel([[i]*3 for i in df.index]))
Out[12]:
desc interval
aaa a ##1
aaa b ##2
aaa c ##3
bbb d ##4
bbb e ##5
bbb f ##6
ccc g ##7
ccc h ##8
ccc i ##9
但我很确定还有其他一些函数,如 pandas.MultiIndex
(将您的 interval1、interval2 和 interval3 列分组到"间隔"级别)和/或pandas.melt
(或者可能是 stack
方法)