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个零。