簡體   English   中英

在Pandas DataFrame列中重新分配條目

[英]Reassigning Entries in a Column of Pandas DataFrame

我的目標是有條件地為數據幀建立索引並為這些索引更改列中的值。

我打算瀏覽“ A”列以找到條目=“ a”,並用“ okay”一詞更新其“ 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”,以及如何解決?

謝謝。

嘗試使用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"

如果我正確理解這一點,則只想替換與給定條件匹配的那些行上的列的值(即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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM