如果这是重复的道歉,但我找不到类似的问题。
我有一个玩具数据框:
A B participant
0 1 3 1
1 2 4 1
2 5 8 2
3 4 9 2
我有一个列表,对应于为每个参与者进行的单个测量。
measurement_list = [2.5, 4.7]
如何将每个参与者的测量分配到新列?期望的:
A B participant measurement
0 1 3 1 2.5
1 2 4 1 2.5
2 5 8 2 4.7
3 4 9 2 4.7
(真正的数据集要大得多。)
答案 0 :(得分:4)
使用../
np.repeat
答案 1 :(得分:1)
您可以分两步完成此操作。
#if it is unsorted dataframe , using sort_values 1st
#df=df.sort_values('participant')
df.assign(measurement=np.repeat(measurement_list,df.participant.value_counts(sort=False)))
Out[324]:
A B participant measurement
0 1 3 1 2.5
1 2 4 1 2.5
2 5 8 2 4.7
3 4 9 2 4.7
<强>结果强>
d = dict(enumerate(measurement_list, 1))
df['measurement'] = df['participant'].map(d)
<强>解释强>
A B participant measurement
0 1 3 1 2.5
1 2 4 1 2.5
2 5 8 2 4.7
3 4 9 2 4.7
创建字典映射。enumerate
通过字典将参与者映射到测量值。答案 2 :(得分:1)
这假设参与者与measurement_list
中的职位之间存在一对一的关系。我利用Numpy阵列切片。这应该非常快。
measurement_list = np.array([2.5, 4.7])
df.assign(measurement=measurement_list[df.participant.values - 1])
A B participant measurement
0 1 3 1 2.5
1 2 4 1 2.5
2 5 8 2 4.7
3 4 9 2 4.7
答案 3 :(得分:0)
这听起来像是DataFrame.apply的绝佳候选人。
根据您的设置代码:
In [1]: import pandas as pd
In [2]: df1 = pd.DataFrame(data=[
...: (1, 3, 1),
...: (2, 4, 1),
...: (5, 8, 2),
...: (4, 9, 2)], columns=['A', 'B', 'participant'])
In [3]: measurement_list = [2.5, 4.7]
您可以轻松构建第二个数据框,将新列映射到测量列表中相应索引的值,如下所示:
In [4]: df_with_measures = df1.assign(measurement=lambda x: x.participant.apply(lambda y: measurement_list[y - 1]))
In [5]: df_with_measures
Out[5]:
A B participant measurement
0 1 3 1 2.5
1 2 4 1 2.5
2 5 8 2 4.7
3 4 9 2 4.7
这将获取现有数据框df1
,并通过将提供的函数应用于整个现有数据框来指定新列。我使用的lambda采用提供的数据帧并将简单映射应用于现有参与者列(使用Series.apply)
注意根据测量列表中从零开始的索引来查看参与者的基于单一的标识符。