对于pandas数据帧中的所有行,根据其他列中的值替换列值

Kor*_*zak 0 python replace apply pandas

我在思考某些事情时遇到了麻烦,并且会喜欢一些指导.

我有一个数据框,其中包含具有应上载某些文件的事件日期的列,以及包含这些事件名称的列.因此事件可以是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
Run Code Online (Sandbox Code Playgroud)

目标

     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
Run Code Online (Sandbox Code Playgroud)

换句话说,对于因为不期望文件而应该为空的空白,将该值替换为"Not Needed",同时保留其他空白.

我试过用.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", "")
Run Code Online (Sandbox Code Playgroud)

如何根据整个数据框中另一列中的值更改一列中的值?我想要的基本上是这样的:

对于数据框中的每一行如果VisitName列中的值== X将ColumnA中的值更改为"Not Expected" 在此输入图像描述
谢谢!!

Edw*_*nan 6

所以,我可以很容易地回答你的基本问题,但是我认为你可能想要改变的一些风格的东西我想进入.我很确定这个问题已在其他主题中得到解决,但你有一些问题包含在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"
Run Code Online (Sandbox Code Playgroud)

这是pandas中基于另一列中其他值更改DataFrame中值的首选方法.

现在,关于您发布的原始DataFrame有一些我想提及的内容.首先,如果数据框单元格中已经有Null值,则可以使用pandas dataframe fillna方法填充这些值.

    df.fillna("Not Expected")
Run Code Online (Sandbox Code Playgroud)

其次,为什么要在默认的Null值上使用字符串"NN"或"Not Needed"?对于pandas中的任何操作,我更喜欢坚持实际的空值,以便您可以在具有空值的数据帧上自由使用聚合函数,如sum或count.

其次,索引包含重复值:

    df.index = ["X", "X", "Y", "Z", "X", "Z"]
Run Code Online (Sandbox Code Playgroud)

数据帧将允许重复的索引值,但它们可以以您需要注意的有趣方式运行.

例如:

    print(df)
Run Code Online (Sandbox Code Playgroud)

回报

        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
Run Code Online (Sandbox Code Playgroud)

在VisitName中为X设置值

    df.loc["X", "VisitName"] = "test"
Run Code Online (Sandbox Code Playgroud)

回报

      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
Run Code Online (Sandbox Code Playgroud)

如果我正在处理这个问题,我要么使用日期作为索引,在文件列中使用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
Run Code Online (Sandbox Code Playgroud)

或者我只使用整数索引,其中包含日期列和正在发送文件的列.

  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
Run Code Online (Sandbox Code Playgroud)

我的意思是,如果你被锁定使用其他设置,那很好,但我认为这些将更容易使用数据帧设置,因为它们更容易支持groupby方法.

另外,请记住,如果您使用的是for循环,那么您可能也不会使用pandas.大熊猫的全部意义在于它使用C来加速索引操作.永远不要使用

    for row in df.index:
        df.loc[row, 'columna'] += 2.
Run Code Online (Sandbox Code Playgroud)

一直用

    df.loc[:, 'columna'] += 2.
Run Code Online (Sandbox Code Playgroud)