我想用复杂的子集模式替换熊猫数据框中的值。
使用.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().
答案 0 :(得分:1)
您可以对.loc
分配的一个loc
链进行安全操作
df.loc[df.index.isin(['2019-01-05','2019-01-09'])&df.a.eq('foo'),'b']=np.nan