繁体   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