Python 如何优化以下代码?

Python 如何优化以下代码?,python,pandas,Python,Pandas,我正在用python编写一个程序来替换数据帧的一些值,其思想是我有一个名为file.txt的文件,如下所示: A:s:Y:0.1:0.1:0.1:0.2:0.1 B:r:D:0.3:0.5:0.1:0.2:0.2 C:f:C:0.3:0.4:0.2:-0.1:0.4 D:f:C:0.1:0.2:0.1:0.1:0.1 F:f:C:0.1:-0.1:-0.1:0.1:0.1 G:f:C:0.0:-0.1:0.1:0.3:0.4 H:M:D:0.1:0.4:0.1:0.0:0.4 我想使用“::”

我正在用python编写一个程序来替换数据帧的一些值,其思想是我有一个名为file.txt的文件,如下所示:

A:s:Y:0.1:0.1:0.1:0.2:0.1
B:r:D:0.3:0.5:0.1:0.2:0.2
C:f:C:0.3:0.4:0.2:-0.1:0.4
D:f:C:0.1:0.2:0.1:0.1:0.1
F:f:C:0.1:-0.1:-0.1:0.1:0.1
G:f:C:0.0:-0.1:0.1:0.3:0.4
H:M:D:0.1:0.4:0.1:0.0:0.4
我想使用“::”作为分隔符,我想按照以下规则替换某些字符串的四列值:

属于范围1的所有值都将替换为“N”:

range1=[-0.2,-0.1,0,0.1,0.2] -> 'N'
属于范围2的所有值都将替换为“L”:

range2=[-0.5,-0.4,-0.3] -> 'L'
属于范围3的所有值都将替换为“H”:

range3=[0.3,0.4,0.5]
为了实现这一点,我尝试了以下方法:

import pandas as pd

df= pd.read_csv('file.txt', sep=':',header=None)

labels=df[3]


range1=[-0.2,-0.1,0,0.1,0.2]

range2=[-0.5,-0.4,-0.3]

range3=[0.3,0.4,0.5]

lookup = {'N': range1, 'L': range2, 'H': range3}




for k, v in lookup.items():
    df.loc[df[3].isin(v), 3] = k


for k, v in lookup.items():
    df.loc[df[4].isin(v), 4] = k


for k, v in lookup.items():
    df.loc[df[5].isin(v), 5] = k

for k, v in lookup.items():
    df.loc[df[6].isin(v), 6] = k

for k, v in lookup.items():
    df.loc[df[7].isin(v), 7] = k


print(df)

它工作得很好,但我想避免使用这么多FOR,我想感谢任何关于如何实现这一点的建议。

您可以使用
where

for k, v in lookup.items():
    df = df.where(~df.isin(v), k)
这表示当
v
中不包含
df
的值时,保留这些值。否则,将其替换为值
k
。分配在每次迭代时覆盖
df
,以累积分类标签

此方法在一个操作中对所有列都有效,因此只有当您想用其分类编码字母替换给定数值的每个实例时,它才有效

还有另一个选项,其中
指定就地修改,但不幸的是,它不能用于具有混合列类型的数据帧。在您的示例中,列0、1和2的类型为
object
,其余的类型为
float
。因此,
pandas
保守地(低效地)假设它必须将所有内容转换为
对象来执行就地覆盖,并引发
TypeError
,而不是进一步检查是否只有相同类型的列实际受到变异的影响

例如,这:

df.where(~df.isin(v), k, inplace=True)
将引发
TypeError

对熊猫的这种限制相当令人沮丧。例如,您也不能使用常规pandas分配来解决此问题,因为以下内容也给出了相同的
TypeError

for k, v in lookup.items():
    df.where(~df.isin(v), inplace=True)
    df[df.isnull()] = k # <-- same TypeError  
查找.items()中k、v的
:
df.where(~df.isin(v),inplace=True)

df[df.isnull()]=k#感谢您的支持,是的,我的数据框包含混合列类型,但是您给我的第一种方法非常有用,这就是我所寻找的。