将列移动到pandas dataframe中的数据

时间:2017-07-22 20:58:25

标签: python pandas dataframe

我正在尝试整理已经存在的pandas数据帧。

我有导入的csv文件,看起来像下面的内容(这是它的简化版本):

trial_num  trial_name  unit_1_act  unit_2_act  unit_3_act  unit_4_act
0          face           0.0      0.000000      0.272244      0.006428   
1          face           0.0      0.000000      0.898450      0.000000   
2          face           0.0      0.893845      0.000000      0.000000   
3          scene          0.0      0.879367      0.000000      0.006312   
4          scene          0.0      0.000000      0.000000      0.000000   

在这种形式中,我在每一行中有多个观察(每个" unit_X_act"是一个单独的观察。)我想将它们分开,以便每行有一个观察。

换句话说,我想改变这一点,而不是让标题为" unit_1_act," " unit_2_act,"等等,我会有以下内容:一栏标题为"单元号,"其值可以是" unit_1," " UNIT_2,"等等,然后是一个标题为"活动的专栏,"它具有以前在每个" unit_X_act"之下的值。列。

4 个答案:

答案 0 :(得分:3)

您也可以在重命名列后使用堆栈。

df.set_index(['trial_num','trial_name'],inplace=True)
df.stack(inplace=True)
df.stack().reset_index()

答案 1 :(得分:3)

我们也可以使用pd.lreshape()方法:

In [74]: x = np.repeat(df.columns[df.columns.str.contains(r'^unit_')].str.replace('_act','').values,
    ...:               len(df))
    ...:
    ...: pd.lreshape(df, {'activity': df.columns[df.columns.str.contains(r'^unit_')]}) \
    ...:   .assign(unit_number=x)
    ...:
Out[74]:
   trial_name  trial_num  activity unit_number
0        face          0  0.000000      unit_1
1        face          1  0.000000      unit_1
2        face          2  0.000000      unit_1
3       scene          3  0.000000      unit_1
4       scene          4  0.000000      unit_1
5        face          0  0.000000      unit_2
6        face          1  0.000000      unit_2
7        face          2  0.893845      unit_2
8       scene          3  0.879367      unit_2
9       scene          4  0.000000      unit_2
10       face          0  0.272244      unit_3
11       face          1  0.898450      unit_3
12       face          2  0.000000      unit_3
13      scene          3  0.000000      unit_3
14      scene          4  0.000000      unit_3
15       face          0  0.006428      unit_4
16       face          1  0.000000      unit_4
17       face          2  0.000000      unit_4
18      scene          3  0.006312      unit_4
19      scene          4  0.000000      unit_4

答案 2 :(得分:2)

您可以先重命名“unit_”列,然后使用melt来执行此操作:

# remove "_act" suffix from "unit_" columns
df.columns = [x.replace("_act", "") for x in df.columns]

# melt "unit_" columns into key-value columns "unit_number" and "value_name"
df.melt(id_vars=["trial_num", "trial_name"], value_vars=[x for x in df.columns if "unit_" in x], var_name="unit_number", value_name="activity")

#     trial_num trial_name unit_number  activity
# 0           0       face      unit_1  0.000000
# 1           1       face      unit_1  0.000000
# 2           2       face      unit_1  0.000000
# 3           3      scene      unit_1  0.000000
# 4           4      scene      unit_1  0.000000
# 5           0       face      unit_2  0.000000
# 6           1       face      unit_2  0.000000
# ...         ...    ...        ...     ...

使用value_vars melt参数的列表推导允许您融合以“unit _”开头的任意数量的列。

答案 3 :(得分:1)

您可以在重命名这样的列时使用set_indexstackreset_index

d1 = df.set_index(['trial_num', 'trial_name'])
d1.columns = d1.columns.str.rsplit('_', 1, expand=True)
d1.columns.names = ['unit_number', None]

d1.stack(0).act.reset_index(name='activity')

    trial_num trial_name unit_number  activity
0           0       face      unit_1  0.000000
1           0       face      unit_2  0.000000
2           0       face      unit_3  0.272244
3           0       face      unit_4  0.006428
4           1       face      unit_1  0.000000
5           1       face      unit_2  0.000000
6           1       face      unit_3  0.898450
7           1       face      unit_4  0.000000
8           2       face      unit_1  0.000000
9           2       face      unit_2  0.893845
10          2       face      unit_3  0.000000
11          2       face      unit_4  0.000000
12          3      scene      unit_1  0.000000
13          3      scene      unit_2  0.879367
14          3      scene      unit_3  0.000000
15          3      scene      unit_4  0.006312
16          4      scene      unit_1  0.000000
17          4      scene      unit_2  0.000000
18          4      scene      unit_3  0.000000
19          4      scene      unit_4  0.000000