簡體   English   中英

如何按條件選擇pandas數據框中的單個單元格

[英]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.

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