簡體   English   中英

對於熊貓數據框中的所有行,根據其他列中的值替換列值

[英]Replace column value based on value in other column, for all rows in a pandas dataframe

我在用Python來思考某些問題時遇到麻煩,並且希望獲得一些指導。

我有一個數據框,其中包含帶有事件日期的列和某些事件的名稱,這些事件的日期應在該日期上載某些文件。 因此事件可以是X,Y,Z,文件可以是1、2、3。

並非所有文件都需要在所有事件上上傳,即,如果是事件X,則需要上傳文件1、2和3,但是如果是事件Y,則只需上傳文件3。 日期列中有一個日期或為空白。

我想要做的是,對於不需要事件的所有文件,將空白替換為“不需要”。

初始:

    File1   File2  File3
X   Aug 1          Sept 1
X   Aug 3   Aug 4  Sept 9
Y                  Sept 10
Z   Aug 12
X   Aug 13  Aug 15
Z   Aug 1

目標

     File1   File2  File3
X   Aug 1          Sept 1
X   Aug 3   Aug 4  Sept 9
Y   NN      NN     Sept 10
Z   Aug 12  NN     NN
X   Aug 13  Aug 15
Z   Aug 1   NN     NN

因此,換句話說,對於由於不需要文件而應該為空白的空格,請將該值替換為“不需要”,而將其他空格留空。

我嘗試使用帶有功能的.replace()、. apply()來執行此操作,但沒有成功。

下面的代碼可以工作,但它不僅在存在匹配項時,甚至在沒有匹配項時也可以工作。

Fill in descriptive text for scales not collected at certain visits (where upload dates would be blank)
df_combined['FAQ-Audio-upDate'] = np.where(df_combined['VisitName'] == "Screening", "FAQ Not Expected", "")
df_combined['FAQ-Form-upDate'] = np.where(df_combined['VisitName'] == "Screening", "FAQ Not Expected", "")

如何在整個數據框中基於另一列中的值更改一列中的值? 我想要的基本上是這樣的:

對於數據框中的每一行如果VisitName列中的值== X將ColumnA中的值更改為“ Not Expected” 在此處輸入圖片說明
謝謝!!

因此,我可以很輕松地回答您的基本問題,但是我認為您可能想要更改一些我想了解的樣式問題。 我可以肯定這個問題已經在其他線程中解決了,但是您將幾個問題歸結為1,所以我只想在這里解決

對於數據框中的每一行如果VisitName列中的值== X將ColumnA中的值更改為“ Not Expected”

您想使用索引切片來設置值。 根據所需的邏輯獲取數據框的布爾掩碼,使用該掩碼創建僅包含要更新的行的新數據框,獲取此新數據框的索引,並將此索引與原始數據框一起使用以更改值結束。

    import pandas as pd
    df = pd.DataFrame(data=None, index=["X", "Y", "Z"], columns=["VisitName",
    "ColumnA", "ColumnB"])

    not_expected_index = df[df.loc[:, "VisitName"] == "X"].index
    df.loc[not_expected_index, "ColumnA"] = "Not Expected"

這是熊貓根據另一列中的其他值更改DataFrame中的值的首選方法。

現在,關於您發布的原始DataFrame,有幾件事我想提及。 首先,如果數據框單元格中已經有Null值,則可以使用pandas數據框fillna方法填充這些值。

    df.fillna("Not Expected")

其次,為什么要在默認的Null值上使用字符串“ NN”或“不需要”? 對於熊貓內的任何操作,我都希望堅持使用實際的空值,這樣您就可以在具有空值的數據幀上使用求和或聚合計數等聚合函數。

其次,索引包含重復值:

    df.index = ["X", "X", "Y", "Z", "X", "Z"]

數據框將允許重復的索引值,但是它們可以以您需要注意的有趣方式表現。

例如:

    print(df)

退貨

        VisitName ColumnA ColumnB
    X       NaN     NaN     NaN
    X       NaN     NaN     NaN
    Y       NaN     NaN     NaN
    Z       NaN     NaN     NaN
    X       NaN     NaN     NaN
    Z       NaN     NaN     NaN

在X的VisitName中設置一個值

    df.loc["X", "VisitName"] = "test"

退貨

      VisitName ColumnA ColumnB
    X      "test"   NaN     NaN
    X      "test"   NaN     NaN
    Y       NaN     NaN     NaN
    Z       NaN     NaN     NaN
    X      "test"   NaN     NaN
    Z       NaN     NaN     NaN

如果我要解決此問題,則可以使用日期作為索引,在文件列中使用True或False值,具體取決於該日期是否需要發送,

     index       File1 File2 File3 
    8/01/17      True  False True
    8/08/17      False True  True
    8/15/17      True  True  False 
    8/24/17      False True  False 
    9/01/17      False False False 
    9/12/17      True  False True

或者我只使用整數索引,其中一列用於日期,一列用於發送文件。

  index    date     file
    0      8/01/17   1
    1      8/01/17   2
    2      8/08/17   2
    3      8/15/17   1
    4      8/15/17   2
    5      8/15/17   3

我的意思是,如果您被鎖定使用其他設置,那很好,但是我認為這些數據框設置將更易於使用,因為它們將更輕松地支持groupby方法

另外,請記住,如果您使用的是for循環,則最好不要使用熊貓。 熊貓的全部要點是它使用C來加速索引操作。 永遠不要使用

    for row in df.index:
        df.loc[row, 'columna'] += 2.

一律使用

    df.loc[:, 'columna'] += 2.

暫無
暫無

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

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