簡體   English   中英

如何根據條件從 2 個列表向 Pandas 添加新列

[英]How to add a new column to pandas from 2 lists based on condition

我有一個熊貓數據框

import pandas as pd
df = 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_avalue_list_b獲取值,具體取決於索引是在index_list_a還是index_list_b

我試過這個,但它不起作用:

df[df.index.isin(index_list_a)]['col_f'] = value_list_a
df[df.index.isin(index_list_b)]['col_f'] = value_list_b

你可以試試:

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

這不是最有效的方法,但它非常易讀且易於遵循:

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

首先,您必須更改分配部分以使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM