对于pandas数据帧

时间:2017-08-28 16:42:14

标签: python pandas replace apply

我在思考某些事情方面遇到了麻烦,并希望得到一些指导。

我有一个数据框,其中包含应该上传某些文件的事件日期的列,以及包含这些事件名称的列。因此事件可以是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

所以换句话说,对于因为不期望文件而应该为空的空白,用'#34; 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", "")

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

对于数据框中的每一行      如果VisitName列中的值== X.           将ColumnA中的值更改为" Not Expected" enter image description here
谢谢!!

1 个答案:

答案 0 :(得分:6)

所以,我可以很容易地回答你的基本问题,但我认为你可能想要改变的一些风格的东西,我想进入。我相当肯定这个问题已在其他主题中得到解决,但是您已经解决了一些问题,所以我只是在这里解决它们

  

对于数据框中的每一行如果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"

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

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

    df.fillna("Not Expected")

其次,为什么要使用字符串" NN"或者"不需要"超过默认的Null值?对于pandas中的任何操作,我更喜欢坚持使用实际的空值,这样就可以在具有空值的数据帧上自由使用sum或count等聚合函数。

其次,索引包含重复值:

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

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

例如:

    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的访问名称中设置值

    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

我的意思是,如果你被锁定使用其他设置,那很好,但我认为这些数据框设置更容易使用,因为他们支持{{3}更容易。

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

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

始终使用

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