问题描述
我有像这样的数据框:
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
但是我对这种方法不是很满意,因此,如果您知道如何将其更好地应用于这种情况,则可以解决我的问题
1楼
我相信问题在于迭代器返回行的副本,并且修改副本不会修改原始数据。
您可以使用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
值的工作原理类似。