假设我有以下列表:
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)
。
但是,这不会成功。然后,我将需要再次附加两个数据帧(y
和df_y
),并且我丢失了要从df_x
维护的原始索引的信息。
答案 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)
您可以merge
。 pd.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