为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据条件从 2 个列表中向 pandas 添加新列

如何根据条件从 2 个列表中向 pandas 添加新列

隔江千里 2023-07-05 17:42:43
我有一个熊猫数据框import pandas as pddf = pd.DataFrame({'col_a' : [1,2,3], 'col_b':[2,3,4]})我还列出了 4 个清单:index_list_a = [0,2]value_list_a = ['a', 'c']index_list_b = [1]value_list_b = ['b']我想添加一个新列,df它将从 或 中获取值value_list_a,value_list_b具体取决于索引是否位于index_list_a或index_list_b我尝试了这个,但它不起作用:df[df.index.isin(index_list_a)]['col_f'] = value_list_adf[df.index.isin(index_list_b)]['col_f'] = value_list_b
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

你可以试试:


s =pd.Series(dict(zip(index_list_a+index_list_b,value_list_a+value_list_b)),name='colF')

#s=pd.Series(data=value_list_a+value_list_b,index=index_list_a+index_list_b,name='colF')

out = df.join(s)

   col_a  col_b colF

0      1      2    a

1      2      3    b

2      3      4    c


查看完整回答
反对 回复 2023-07-05
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这不是最有效的方法,但它非常可读且易于遵循:


import pandas as pd


df = pd.DataFrame({'col_a' : [1,2,3], 'col_b':[2,3,4]})


index_list_a = [0,2]

value_list_a = ['a', 'c']


index_list_b = [1]

value_list_b = ['b']



for index, value in zip(

    index_list_a + index_list_b,

    value_list_a + value_list_b

):

    df.loc[index, 'col_f'] = value

    

print(df)

   col_a  col_b col_f

0      1      2     a

1      2      3     b

2      3      4     c

其单行且更高效的版本是(正如 @Shubham Sharma 所指出的):


df.loc[index_list_a + index_list_b, 'col_f'] =  value_list_a + value_list_b


查看完整回答
反对 回复 2023-07-05
?
holdtom

TA贡献1805条经验 获得超10个赞

首先,您必须更改分配部分以使用 loc 并为 col_f 添加占位符


df['col_f'] = np.nan

df.loc[df.index.isin(index_list_a),"col_f"] = value_list_a

其次我认为你有错误。你的代码有索引[1,3],但python从0开始。


index_list_a = [0,2]

value_list_a = ['a', 'c']

import pandas as pd

import numpy as np



df = pd.DataFrame({'col_a' : [1,2,3], 'col_b':[2,3,4]})


index_list_a = [0,2]

value_list_a = ['a', 'c']


index_list_b = [2]

value_list_b = ['b']


df['col_f'] = np.nan



df.loc[df.index.isin(index_list_a),"col_f"] = value_list_a

但是如果你想要一个通用的解决方案并且 [1,3] 是故意的,你可以使用下面的函数


def create_intersect(x,y,z):

    common = list(set(x).intersection(set(y)))

    for i in range(len(y)):

        if y[i] not in common:

            y.pop(i); z.pop(i);

    return y,z

这允许您预先消除数据框中不存在的任何索引


import pandas as pd

import numpy as np



def create_intersect(x,y,z):

    common = list(set(x).intersection(set(y)))

    for i in range(len(y)):

        if y[i] not in common:

            y.pop(i); z.pop(i);

    return y,z




df = pd.DataFrame({'col_a' : [1,2,3], 'col_b':[2,3,4]})


index_list_a,value_list_a = create_intersect(df.index, [1,3], ['a', 'c'])


df['col_f'] = np.nan


df.loc[df.index.isin(index_list_a),"col_f"] = value_list_a


查看完整回答
反对 回复 2023-07-05
  • 3 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信