当通过复杂索引和基于布尔的条件子集时,如何为熊猫数据框分配值?

时间:2019-07-17 23:24:20

标签: python pandas dataframe subset

我想用复杂的子集模式替换熊猫数据框中的值。

使用.loc访问器,我只能通过链接多个条件来进行子集化,因为某些条件是基于索引的。但是似乎在这样的子集链之后我无法分配值。 更新:另一个问题是由重复的索引引起的。我已经相应地更新了示例。

  MongoURI:
    "mongodb+srv://user1:" +
    encodeURIComponent("user12345") +
    "@test-cluster1-ioe1x.mongodb.net/test?retryWrites=true&w=majority"
};

const db = require("./config/keys").MongoURI;

mongoose
  .connect(db, { useNewUrlParser: true })
  .then(() => console.log("MongoDB Connected"))
  .catch(err => console.log(err));

结果:

import numpy as np
import pandas as pd

df = pd.DataFrame({'a': ['foo'] * 10 + ['bar'] * 10, 'b': range(20)}, index=pd.date_range('2019-01-01','2019-01-10').append(pd.date_range('2019-01-01','2019-01-10')))

df.loc[df['a'] == 'foo', 'b'].loc[pd.to_datetime(['2019-01-05','2019-01-09'])] = np.nan

df

预期:

              a     b
2019-01-01  foo     0
2019-01-02  foo     1
2019-01-03  foo     2
2019-01-04  foo     3
2019-01-05  foo     4
2019-01-06  foo     5
2019-01-07  foo     6
2019-01-08  foo     7
2019-01-09  foo     8
2019-01-10  foo     9
2019-01-01  bar     10
2019-01-02  bar     11
2019-01-03  bar     12
2019-01-04  bar     13
2019-01-05  bar     14
2019-01-06  bar     15
2019-01-07  bar     16
2019-01-08  bar     17
2019-01-09  bar     18
2019-01-10  bar     19

我尝试了以下替代方法:

              a     b
2019-01-01  foo     0
2019-01-02  foo     1
2019-01-03  foo     2
2019-01-04  foo     3
2019-01-05  foo     NaN
2019-01-06  foo     5
2019-01-07  foo     6
2019-01-08  foo     7
2019-01-09  foo     NaN
2019-01-10  foo     9
2019-01-01  bar     10
2019-01-02  bar     11
2019-01-03  bar     12
2019-01-04  bar     13
2019-01-05  bar     14
2019-01-06  bar     15
2019-01-07  bar     16
2019-01-08  bar     17
2019-01-09  bar     18
2019-01-10  bar     19

掉落:

df.loc[df['a'] == 'foo' and df.index.isin(['2019-01-05','2019-01-09']), 'b']

甚至都不行,因为isin返回一个没有基于日期的索引的数组:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

1 个答案:

答案 0 :(得分:1)

您可以对.loc分配的一个loc链进行安全操作

df.loc[df.index.isin(['2019-01-05','2019-01-09'])&df.a.eq('foo'),'b']=np.nan