将 Pandas 数据帧中的一列移动到数据中。

4

我将尝试整理一个已存在的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 number”的列,其值可以是“unit_1”,“unit_2”等,然后是一个名为“activity”的列,其值是以前在每个“unit_X_act”列下的值。
4个回答

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

3
你可以在重命名列后使用堆栈(stack)。
df.set_index(['trial_num','trial_name'],inplace=True)
df.stack(inplace=True)
df.stack().reset_index()

这是一个有点冗长的单行代码: df.rename(columns=lambda x: x.replace('_act','') if '_act' in x else x).set_index(['trial_num','trial_name']).stack().reset_index().rename(columns={'level_2':'unit_number','0':'activity'}) ;-) - MaxU - stand with Ukraine

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_" 开头的列。

1
很好的回答!+1 或者我们可以使用以下代码:df.columns[df.columns.str.contains(r'^unit_')].tolist() 来选择所有 unit_* 列... - MaxU - stand with Ukraine

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接