当前位置: 代码迷 >> python >> 无法替换数据框中的列值
  详细解决方案

无法替换数据框中的列值

热度:101   发布时间:2023-06-16 14:05:39.0

我有像这样的数据框:

              date_time       ID    Direction
  0 2015-05-22 05:37:59       10.0   
  1 2015-05-22 05:37:59       10.0    TRUE
  2 2015-05-22 05:37:59       10.0     
  3 2015-05-26 05:56:59       9.0     
  4 2015-05-26 05:56:59       9.0     TRUE
  5 2015-05-26 05:56:59       10.0    TRUE
 ......................    ......  ......

我尝试列的值解码Direction ,更换TRUE通过right ,如果相应的ID是9.0和left ,如果是10.0

我正在尝试以下代码:

def directions():
    for index, row in df.iterrows():
        if row['ID']=='9.0':
            row['Direction'] = row['Direction'].map({'TRUE': 'right', '': ''})
        elif row['ID']=='10.0':
            row['Direction'] = row['Direction'].map({'TRUE': 'left', '': ''})
    return df

它不会引发任何错误,但不会更改现有数据框中的任何内容,您知道哪里可能有问题吗? 我曾考虑过使用iloc loc但是我对这种方法不是很满意,因此,如果您知道如何将其更好地应用于这种情况,则可以解决我的问题

我相信问题在于迭代器返回行的副本,并且修改副本不会修改原始数据。 您可以使用loc属性修改数据视图,如下所示:

def directions(df):
    df.loc[(df['ID'] == 9) & (df['Direction'] == 'TRUE'), 'Direction'] = 'right'
    df.loc[(df['ID'] == 10) & (df['Direction'] == 'TRUE'), 'Direction'] = 'left'
    return df

编辑– loc一些解释:

您可以将loc视为以一种灵活的方式索引数据帧的行和列的方法。 语法为df.loc[row_indicator, col_indicator] 行/列指示符非常灵活:它可以是布尔掩码,索引,切片,索引列表等。它与NumPy中可用的各种索引方案非常相似。

让我们详细了解一下此解决方案的作用。 我们首先构造一个布尔掩码,指示ID为9:

>>> mask_ID9 = (df['ID'] == 9)
>>> mask_ID9
0    False
1    False
2    False
3     True
4     True
5    False
Name: ID, dtype: bool

我们可以使用此掩码为数据帧建立索引,并访问掩码为True的所有行:

>>> df.loc[mask_ID9]
             date_time  ID Direction
3  2015-05-26-05:56:59   9        ''
4  2015-05-26-05:56:59   9     right

但是我们还想将其限制在Direction为TRUE的列中:

>>> mask_TRUE = (df['Direction'] == 'TRUE')
>>> mask_TRUE
0    False
1     True
2    False
3    False
4     True
5     True
Name: Direction, dtype: bool

现在,我们可以将它们与逻辑AND运算符结合起来,找到两个条件都为True的位置:

>>> mask_ID9 & mask_TRUE
0    False
1    False
2    False
3    False
4     True
5    False
dtype: bool

使用此索引将仅返回第4行,因为它是唯一满足以下条件的行:

>>> df.loc[mask_ID9 & mask_TRUE]
             date_time  ID Direction
4  2015-05-26-05:56:59   9     right

但是我们不需要整个行,只需要'Direction'列,因此我们将其添加到loc调用中:

>>> df.loc[mask_ID9 & mask_TRUE, 'Direction']
4    TRUE
Name: Direction, dtype: object

现在,我们可以为DataFrame的这一部分分配适当的值:

>>> df.loc[mask_ID9 & mask_TRUE, 'Direction'] = 'right'
>>> df
             date_time  ID Direction
0  2015-05-22-05:37:59  10        ''
1  2015-05-22-05:37:59  10      TRUE
2  2015-05-22-05:37:59  10        ''
3  2015-05-26-05:56:59   9        ''
4  2015-05-26-05:56:59   9     right
5  2015-05-26-05:56:59  10      TRUE

更改left值的工作原理类似。

  相关解决方案