在Pandas DataFrame列中重新分配条目

时间:2018-11-24 18:30:49

标签: python pandas dataframe indexing

我的目标是有条件地为数据帧建立索引并为这些索引更改列中的值。

我打算浏览“ A”列以找到条目=“ a”,并用“好的”一词更新其“ 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)

这给了我以下错误:

SettingWithCopyWarning:

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

请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   self._update_inplace(new_data)

按照文档(据我所知),我尝试了以下操作:

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

我不知道为什么没有将“ NaN”重新分配为“ okay”,以及如何解决?

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试使用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

创建字典框架并使用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"

答案 1 :(得分:0)

如果我理解正确,您只想替换与给定条件匹配的那些行上的列的值(即iOS列属于某个组,这里用单个值{{1} }。以下应该可以解决问题:

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)运算符,因此必须使用==

第二个参数仅选择“ B”列。 然后,您只需分配所需的值(这是一个常数)即可。

以下是输出:

in

如果您想对事物进行幻想,则可能需要执行以下操作:

.isin()

哪个给你:

   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