如何按条件选择pandas数据框中的单个单元格

时间:2017-03-31 09:50:15

标签: python pandas

我有一个如下数据框:

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列值上的条件在此单元格中附加列表?

2 个答案:

答案 0 :(得分:2)

您可以利用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]

答案 1 :(得分:1)

这不是在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