重复列表值并将新列添加到数据框

时间:2018-03-12 17:18:17

标签: python list pandas dataframe

如果这是重复的道歉,但我找不到类似的问题。

我有一个玩具数据框:

      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

(真正的数据集要大得多。)

4 个答案:

答案 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)

<强>解释

  • 使用可选的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 创建字典映射。
  • 使用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

注意根据测量列表中从零开始的索引来查看参与者的基于单一的标识符。