问题描述
我有一个 Pandas 数据框,其中有两个对象列 FEATURE 和 FEATURE_VALUE,分别代表特征的名称和特征的值。虽然 FEATURE_VALUE 是一个对象列,但实际上它包含类型 int、float 和 str。我想基于 FEATURE 对 FEATURE_VALUE 进行聚合,但是 str 格式中的 int 和 float 值的行为与 int 和 float 格式中的行为不同。我想知道是否有一种方法可以编写 labmda 函数或可以根据聚合时 FEATURE 的值将 FEATURE_VALUE 的值转换为浮点数的函数,而不是首先生成单独转换的列。 在下面的例子中,A 和 C 的 FEATURE 值是数值,而 FEATURE B 是字符串值。
import pandas as pd
d = {'FEATURE': ['A','B','A','C','C'],'FEATURE_VALUE': ['9','2','11','G',' 100','9']}
df = pd.DataFrame(data=d)
FEATURE FEATURE_VALUE
0 A 9
1 B A
2 A 2
3 A 11
4 B G
5 C 100
6 C 9
#desired_output after aggregate:
df_agg
FEATURE MIN_FEATURE_VALUE MAX_FEATURE_VALUE
A 2 11
B A G
C 9 100
请注意,在 FEATURE_VALUE 上使用正常的最小/最大聚合不起作用,因为 '100' > '9' 是假的 但 100 > 9 为真
我有超过 200 个独特的 FEATURE 值,我知道哪些特征是浮点/整数,哪些是字符串。有没有办法在聚合过程中一次性完成数据转换?
解决方法
试试:
首先利用pd.to_numeric()
将字符串数值转化为实际数值:
df['FEATURE_VALUE']=pd.to_numeric(df['FEATURE_VALUE'],errors='coerce').fillna(df['FEATURE_VALUE'])
最后使用 groupby()
+agg()
(带命名元组):
out=df.groupby('FEATURE',as_index=False).agg(MIN_FEATURE_VALUE=('FEATURE_VALUE','min'),MAX_FEATURE_VALUE=('FEATURE_VALUE','max'))
或
通过pivot_table()
:
out=df.pivot_table('FEATURE_VALUE','FEATURE',aggfunc=['min','max'])
out.columns=out.columns.map('_'.join).str.upper()
out=out.reset_index()
out
的输出:
FEATURE MIN_FEATURE_VALUE MAX_FEATURE_VALUE
0 A 2.0 11.0
1 B A G
2 C 9.0 100.0