Python 在dataframe上迭代并使用基于条件的替换方法

Python 在dataframe上迭代并使用基于条件的替换方法,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我正试图在我的数据帧中迭代一个特定的列 该栏为: df['column'] = ['1.4million', '1,235,000','100million',NaN, '14million', '2.5mill'] 我试图清理这个列,并最终将其全部转换为整数,以便进行更多的工作。我被困在清理“百万”的台阶上。我想在有小数点时用五个零替换“百万”(即140万变为140万),在没有小数点时用六个零替换“百万”(即1亿变为100000000) 为了简化,我要做的第一步就是把重点放在过滤掉带有小数点

我正试图在我的数据帧中迭代一个特定的列

该栏为:

df['column'] = ['1.4million', '1,235,000','100million',NaN, '14million', '2.5mill']
我试图清理这个列,并最终将其全部转换为整数,以便进行更多的工作。我被困在清理“百万”的台阶上。我想在有小数点时用五个零替换“百万”(即140万变为140万),在没有小数点时用六个零替换“百万”(即1亿变为100000000)

为了简化,我要做的第一步就是把重点放在过滤掉带有小数点的值,并用5个零替换这些值。我已经尝试使用np.where,但是我不能使用numpy替换方法

我还尝试使用pd.DataFrame.where,但出现错误:

for i,row in df.iterrows():
    df.at[i,'column'] = pd.DataFrame.where('.' in df.at[i,'column'],df.at[i,'column'].replace('million',''),df.at[i,'column'])

``AttributeError: 'numpy.ndarray' object has no attribute 'replace'
我肯定这里有我遗漏的东西。(我也确信我会被告知我不需要在这里使用iterrows,所以我也愿意接受关于这方面的建议)

试试这个:

df['column'].apply(lambda x : x.replace('million','00000'))

在应用此项之前,请确保您的数据类型为字符串。请尝试以下操作:

df['column'].apply(lambda x : x.replace('million','00000'))


在应用此示例数据之前,请确保您的数据类型为字符串-看起来您可以去掉逗号,然后提取所有数字(和
字符),直到字符串
或字符串末尾并将其拆分,例如:

x = df['column'].str.replace(',', '').str.extract('(.*?)(mill.*)?$')
这将为您提供:

         0        1
0      1.4  million
1  1235000      NaN
2      100  million
3      NaN      NaN
4       14  million
5      2.5     mill
0      1400000.0
1      1235000.0
2    100000000.0
3            NaN
4     14000000.0
5      2500000.0
然后取数字部分,乘以一百万,在第1列中有,否则乘以1,例如:

res = pd.to_numeric(x[0]) * np.where(x[1].notna(), 1_000_000, 1)
这将给你:

         0        1
0      1.4  million
1  1235000      NaN
2      100  million
3      NaN      NaN
4       14  million
5      2.5     mill
0      1400000.0
1      1235000.0
2    100000000.0
3            NaN
4     14000000.0
5      2500000.0

给定您的示例数据-看起来您可以去掉逗号,然后提取所有数字(和
字符),直到字符串
mill
或字符串末尾,然后将其拆分,例如:

x = df['column'].str.replace(',', '').str.extract('(.*?)(mill.*)?$')
这将为您提供:

         0        1
0      1.4  million
1  1235000      NaN
2      100  million
3      NaN      NaN
4       14  million
5      2.5     mill
0      1400000.0
1      1235000.0
2    100000000.0
3            NaN
4     14000000.0
5      2500000.0
然后取数字部分,乘以一百万,在第1列中有,否则乘以1,例如:

res = pd.to_numeric(x[0]) * np.where(x[1].notna(), 1_000_000, 1)
这将给你:

         0        1
0      1.4  million
1  1235000      NaN
2      100  million
3      NaN      NaN
4       14  million
5      2.5     mill
0      1400000.0
1      1235000.0
2    100000000.0
3            NaN
4     14000000.0
5      2500000.0
对于给定数据:

df['column'].apply(lambda x: float(str(x).split('m')[0])*10**6
                   if 'million' in str(x) or 'mill' in str(x) else x)
如果列中可能有多种形式的百万,则regex搜索。

对于给定的数据:

df['column'].apply(lambda x: float(str(x).split('m')[0])*10**6
                   if 'million' in str(x) or 'mill' in str(x) else x)

如果列中可能有许多形式的百万,则使用正则表达式搜索。

那么“mill”呢?为什么要使用for循环来实现此目的?@AMC当我在条件下迭代df时,这是我的本能,虽然我从下面的答案中看到for循环是不必要的,而且很耗时。@AdamA当我在df上迭代时,我的本能是有条件的,所以我必须在这些本能上工作!你应该看看Pandas文档,我发现它们很好。那么“mill”呢?你为什么要用for循环呢?@AMC当我在条件下迭代df时,这是我的本能,虽然我从下面的答案中看到for循环是不必要的,而且很耗时。@AdamA当我在df上迭代时,我的本能是有条件的,所以我必须在这些本能上工作!你应该看看Pandas的文档,我觉得它们很好。你为什么不使用Pandas提供的操作?谢谢你的回答,但是问题是有些“百万”单元格需要5个零,有些需要6个零。你为什么不使用Pandas提供的操作?谢谢你的回答,然而,问题是,有些“百万”的单元格需要5个零,有些需要6个零。