![](/img/trans.png)
[英]How to append value to list in single cell in Pandas dataframe based on condition
[英]How to select a single cell in a pandas dataframe by condition
我有一個如下數據框:
df = pd.DataFrame([[2,[4,6,8]],[3,[6,9]],[5,[10]],[7,[]]],columns = ['A','B'])
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
我想在第一列使用條件附加列表。 例如,在單元格df.ix[1,'B']
添加12。 為此,以下工作:
df.ix[1,'b'].append(12)
但是現在我不知道行的索引,只是A
列中值的條件。 使用切片產生數據幀而不是單元格,因此我不能像以前一樣附加單元格的值。 (注意A
中的velues是唯一的,沒有重復)
df.ix[df.A == 3,'B'].append(12)
TypeError: cannot concatenate a non-NDFrame object
所以我的問題如下:如何使用A
列值上的條件將列表附加到此單元格中?
您可以利用pandas將使用為底層對象定義的+
運算符。 在這種情況下[10] + [12]
是[10, 12]
。 我使用的條件只是為了說明不需要只有一行。
df.loc[df.A > 4, 'B'] += [12]
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10, 12]
3 7 [12]
如果偶然某些你的B
列不是lists
,我們可以通過一個函數來實現它們。
def listify(x):
try:
return list(x)
except:
return [x]
df.B = df.B.apply(listify)
例
考慮數據幀df
df = pd.DataFrame(
[[2,[4,6,8]],[3,[6,9]],[5,[10]],[7,[]], [9, 1]],
columns = ['A','B'])
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
4 9 1
如果我們嘗試我的建議,我們會得到
> TypeError:+:'int'和'list'不支持的操作數類型
一旦我們listify
df.B = df.B.apply(listify)
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
4 9 [1]
現在我們可以
df.loc[df.A > 4, 'B'] += [12]
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10, 12]
3 7 [12]
4 9 [1, 12]
這不是在df中存儲列表的正常操作,但是在這里你需要系列的索引標簽,這樣你就可以append
:
In [68]:
idx = df.loc[df['A'] == 3,'B'].index[0]
df.loc[df['A'] == 3,'B'][idx].append(12)
df
Out[68]:
A B
0 2 [4, 6, 8]
1 3 [6, 9, 12]
2 5 [10]
3 7 []
這里df.loc[df['A'] == 3, 'B']
返回一個Series
:
In [70]:
df.loc[df['A'] == 3,'B']
Out[70]:
1 [6, 9]
Name: B, dtype: object
存儲在此處的元素需要使用索引標簽取消引用:
In [71]:
df.loc[df['A'] == 3,'B'][1]
Out[71]:
[6, 9]
所以你需要弄清楚索引標簽:
In [72]:
df.loc[df['A'] == 3,'B'].index[0]
Out[72]:
1
因此,您可以取消引用列表並append
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.