重新分配Pandas DataFrame列中的条目



我的目标是有条件地对数据帧进行索引,并更改列中这些索引的值。

我打算在列"A"中查找条目="A",并用单词"OK"更新其列"B"。

group = ['a']
df = pd.DataFrame({"A": [a,b,a,a,c], "B": [NaN,NaN,NaN,NaN,NaN]})
>>>df
A    B
0  a  NaN
1  b  NaN
2  a  NaN
3  a  NaN
4  c  NaN
df[df['A'].apply(lambda x: x in group)]['B'].fillna('okay', inplace=True)

这给了我以下错误:

使用复制警告设置:

试图在DataFrame 的切片副本上设置值

请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-查看与复制自我_更新位置(新数据(

根据文件(我对它的理解(,我尝试了以下方法:

df[df['A'].apply(lambda x: x in group)].loc[:,'B'].fillna('okay', inplace=True)

我不明白为什么"NaN"到"OK"的重新分配没有原位发生,以及如何纠正?

谢谢。

尝试使用lambda:

解决方案优先:

>>> df
A   B
0  a NaN
1  b NaN
2  a NaN
3  a NaN
4  c NaN

使用lambda+mapapply。。

>>> df["B"] = df["A"].map(lambda x: "okay" if "a" in x else "NaN")
OR# df["B"] = df["A"].map(lambda x: "okay" if "a" in x else np.nan)
OR# df['B'] = df['A'].apply(lambda x: 'okay' if x == 'a' else np.nan)
>>> df
A     B
0  a  okay
1  b   NaN
2  a  okay
3  a  okay
4  c   NaN

解决方案二:

>>> df
A   B
0  a NaN
1  b NaN
2  a NaN
3  a NaN
4  c NaN

创建Dictionary框架并使用map函数将其应用于整个列的另一种奇特方法:

>>> frame = {'a': "okay"}
>>> df['B'] = df['A'].map(frame)
>>> df
A     B
0  a  okay
1  b   NaN
2  a  okay
3  a  okay
4  c   NaN

解决方案三:

这已经由@d_kennetz发布了,但你只想一起俱乐部,你也可以一次完成两列(A和B(的任务:。。

>>> df.loc[df.A == 'a', 'B'] = "okay"

如果我正确理解这一点,您只需要替换那些与给定条件匹配的行上的列的值(即,其中A列属于某个组,此处为单个值'a'(。以下应该可以做到:

import pandas as pd
group = ['a']
df = pd.DataFrame({"A": ['a','b','a','a','c'], "B": [None,None,None,None,None]})
print(df)
df.loc[df['A'].isin(group),'B'] = 'okay'
print(df)

我们在这里所做的是使用.loc过滤器,它只返回现有数据帧的视图。

第一个自变量(df['A'].isin(group)(过滤那些与给定条件匹配的行。请注意,您可以使用相等运算符(==(,但不能使用in运算符,因此必须使用.isin()(。

第二个参数只选择"B"列。然后您只需指定所需的值(它是一个常量(。

这是输出:

A     B
0  a  None
1  b  None
2  a  None
3  a  None
4  c  None
A     B
0  a  okay
1  b  None
2  a  okay
3  a  okay
4  c  None

如果你想更喜欢的东西,你可能想做以下事情:

import pandas as pd
group = ['a', 'b']
df = pd.DataFrame({"A": ['a','b','a','a','c'], "B": [None,None,None,None,None]})
df.loc[df['A'].isin(group),'B'] = "okay, it was " + df['A']+df['A']
print(df)

这给了你:

A                B
0  a  okay, it was aa
1  b  okay, it was bb
2  a  okay, it was aa
3  a  okay, it was aa
4  c             None

最新更新