![](/img/trans.png)
[英]How to add a new row in pandas based on a condition from the first column?
[英]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_a
或value_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.