将列表作为列添加到数据框

时间:2020-03-31 16:17:14

标签: python python-3.x pandas dataframe

假设我有以下列表:

let completion = {
    navigationController?.popViewController(animated: true)
}

guard let coordinator = transitionCoordinator else {
    completion()
    return
}

coordinator.animate(alongsideTransition: nil) { _ in
    completion()
}

还有以下数据帧cond_1 = [1,2] cond_2 = [3,5]

df

我想做的是添加第二列|----------| | Column_1 | |----------| | x | |----------| | y | |----------| | y | |----------| | x | |----------| 。遵循以下条件:

1)如果Column_2包含Column_1,请在x中的Column_2中添加一个值;

2)如果cond_1包含Column_1,请在y的{​​{1}}中添加一个值

所需的输出应如下所示:

Column_2

我一直在尝试使用cond_2

|----------|----------|
| Column_1 | Column_2 |
|----------|----------|
|     x    |     1    |
|----------|----------|
|     y    |     3    |
|----------|----------|
|     y    |     5    |
|----------|----------|
|     x    |     2    |
|----------|----------|

然后,我将对pd.Series值重复相同的操作,以获得df_x = df.loc[df['Column_1'] == "x"] #first I create a dataframe only with the x values df_x['Column_2'] = pd.Series(cond_1)

但是,这不会成功。然后,我将需要再次附加两个数据帧(ydf_y),并且我丢失了要从df_x维护的原始索引的信息。

4 个答案:

答案 0 :(得分:7)

您可以创建一个帮助器类,并在.apply中使用它,例如:

class ReplaceWithNext:
    def __init__(self, **kwargs):
        self.lookup = {k: iter(v) for k, v in kwargs.items()}
    def __call__(self, value):
        return next(self.lookup[value])

然后将其用作:

df['Column_2' ] = df['Column_1'].apply(ReplaceWithNext(x=cond_1, y=cond_2))

会给你的:

  Column_1  Column_2
0        x         1
1        y         3
2        y         5
3        x         2

答案 1 :(得分:3)

带有循环的解决方案:

choice = ['x','y']
cond_1 = [1,2]
cond_2 = [3,5]
d = dict(zip(choice,np.vstack((cond_1,cond_2))))
#{'x': array([1, 2]), 'y': array([3, 5])}

for k,v in d.items():
    df.loc[df['Column_1'].eq(k),'Column2'] = v
print(df)

  Column_1  Column2
0        x      1.0
1        y      3.0
2        y      5.0
3        x      2.0

答案 2 :(得分:2)

您可以mergepd.concat将正确枚举列表中每个元素的索引。我们需要groupby + cumcount DataFrame才能在此处创建此密钥。

s = pd.concat([pd.Series(l).rename('Column_2') for l in [cond_1, cond_2]], 
              keys=['x', 'y'], names=['Column_1', 'N'])

df['N'] = df.groupby('Column_1').cumcount()
df = df.merge(s, on=['Column_1', 'N'], how='left').drop(columns='N')

  Column_1  Column_2
0        x         1
1        y         3
2        y         5
3        x         2

使用keys的{​​{1}}和names参数,我们可以设置如下所示的合并系列

pd.concat

答案 3 :(得分:0)

df = pd.DataFrame({'Column_1':['x', 'y', 'y', 'x'], 'Column_2':['','','','']})

cond_1 = [1,2]
cond_2 = [3,5]

cond_1_idx = 0
cond_2_idx = 0

col_2_list = []
for idx, row in df.iterrows():
    if df.at[idx ,'Column_1'] == 'x':

        col_2_list.append(cond_1[cond_1_idx])
        cond_1_idx +=1

    if df.at[idx ,'Column_1'] == 'y':

        print( df.at[0 ,'Column_1'])
        col_2_list.append(cond_2[cond_2_idx])
        cond_2_idx +=1

df['Column_2'] = col_2_list

    Column_1    Column_2
0   x   1
1   y   3
2   y   5
3   x   2