我正在尝试整理已经存在的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"之下的值。列。
答案 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_index
,stack
和reset_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