我有一个要过滤的数据框
I have a data frame that I’d like to filter
在我要过滤的列中,该列包含来自两个不同来源的数据。我想规范化这些数据。我们以某种方式收集了一些数据,而其他数据行包含以另一种方式收集的数据。有些行包含 1.2 2.3 3.4,但不超过 5。我想将这些数字乘以 1,000 以与其他数字相匹配,并从 1,000 以上的数字中删除逗号。
col1
col2
1
1.641
2
1.548
3
1,807.000
4
1,759.000
听起来您想筛选某些行 (col2 < 5
),应用转换 (col2 * 1000
),然后删除某些内容 (,
)。
df.loc[df['col2']<=5,'col2'] = df['col2']*1000
下一步是删除逗号,但如果您知道 col2 中的所有值都是整数(无小数),那么我认为您可以
df['col2'] = int(df['col2'])
但是应用替换更安全,但前提是值是字符串(如果不是,df['col2'] = str(df['col2'])
)
那么您可以应用以下内容:
df['col'2'] = df['col2'].str.replace(',','')
您可以针对 'col2'
是否包含逗号创建一个布尔掩码。如果它包含逗号,请删除逗号。对于没有逗号的数字,乘以 1000:
mask = df['col2'].str.contains(',')
df.loc[mask, 'col2'] = df.loc[mask, 'col2'].str.replace(',','')
df['col2'] = df['col2'].astype(float)
df.loc[~mask, 'col2'] *= 1000
输出:
col1 col2
0 1 1641.0
1 2 1548.0
2 3 1807.0
3 4 1759.0
我想到的另一件事是 Python 中的类型混合。根据您上面的内容,我的猜测是您将 col2
作为字符串或浮点数。如果是字符串,则通过 replace 方法删除字符串。如果是浮动的,那么你不需要替换逗号(这可能是 Python 显示成千上万但我不记得具体细节的方式)。
运行 print(df.dtypes)
检查。
我只尝试了其中一种解决方案。
Float64。你说的是准确的@fmarz10。我想过滤行并应用转换,然后删除一些内容。第一行代码完美无缺,刚刚好。
df.loc[df[‘col2’]<=5,’col2’] = df[‘col2’]*1000
但是,我确实没有使用第二个建议,因为有些数字不仅仅是整数,而且包含至少两位小数的值。为了完成它,我做了类似的事情,只扫描前几行看起来不错。
df[‘col’2’] = df[‘col2’].replace(‘,’,’’)
对比原来的建议:
df[‘col’2’] = df[‘col2’].str.replace(‘,’,’’)
注意:这行得通,但这是每周数据,每行都是一周的数据,大约有 15,000 行,所以在进行评估之前我只需要浏览几行,但前几行看起来好的。
在我要过滤的列中,该列包含来自两个不同来源的数据。我想规范化这些数据。我们以某种方式收集了一些数据,而其他数据行包含以另一种方式收集的数据。有些行包含 1.2 2.3 3.4,但不超过 5。我想将这些数字乘以 1,000 以与其他数字相匹配,并从 1,000 以上的数字中删除逗号。
col1 | col2 |
---|---|
1 | 1.641 |
2 | 1.548 |
3 | 1,807.000 |
4 | 1,759.000 |
听起来您想筛选某些行 (col2 < 5
),应用转换 (col2 * 1000
),然后删除某些内容 (,
)。
df.loc[df['col2']<=5,'col2'] = df['col2']*1000
下一步是删除逗号,但如果您知道 col2 中的所有值都是整数(无小数),那么我认为您可以
df['col2'] = int(df['col2'])
但是应用替换更安全,但前提是值是字符串(如果不是,df['col2'] = str(df['col2'])
)
那么您可以应用以下内容:
df['col'2'] = df['col2'].str.replace(',','')
您可以针对 'col2'
是否包含逗号创建一个布尔掩码。如果它包含逗号,请删除逗号。对于没有逗号的数字,乘以 1000:
mask = df['col2'].str.contains(',')
df.loc[mask, 'col2'] = df.loc[mask, 'col2'].str.replace(',','')
df['col2'] = df['col2'].astype(float)
df.loc[~mask, 'col2'] *= 1000
输出:
col1 col2
0 1 1641.0
1 2 1548.0
2 3 1807.0
3 4 1759.0
我想到的另一件事是 Python 中的类型混合。根据您上面的内容,我的猜测是您将 col2
作为字符串或浮点数。如果是字符串,则通过 replace 方法删除字符串。如果是浮动的,那么你不需要替换逗号(这可能是 Python 显示成千上万但我不记得具体细节的方式)。
运行 print(df.dtypes)
检查。
我只尝试了其中一种解决方案。
Float64。你说的是准确的@fmarz10。我想过滤行并应用转换,然后删除一些内容。第一行代码完美无缺,刚刚好。
df.loc[df[‘col2’]<=5,’col2’] = df[‘col2’]*1000
但是,我确实没有使用第二个建议,因为有些数字不仅仅是整数,而且包含至少两位小数的值。为了完成它,我做了类似的事情,只扫描前几行看起来不错。
df[‘col’2’] = df[‘col2’].replace(‘,’,’’)
对比原来的建议:
df[‘col’2’] = df[‘col2’].str.replace(‘,’,’’)
注意:这行得通,但这是每周数据,每行都是一周的数据,大约有 15,000 行,所以在进行评估之前我只需要浏览几行,但前几行看起来好的。