我有一个数据框,我追加几行来包含不同类型的元素(浮点数或整数):
df = pd.DataFrame()
df = df.append( pd.DataFrame({'i': [0],
'j': [0.3]}), ignore_index=True)
df = df.append( pd.DataFrame({'i': [1],
'j': [0.6]}), ignore_index=True)
df = df.append( pd.DataFrame({'i': [9],
'j': [0.9]}), ignore_index=True)
现在,我想提取包含最小值的行,例如i
:
df.iloc[df['i'].argmin()]
这给了我
i 0.0
j 0.3
Name: 0, dtype: float64
其中i
现已转换为浮点数。这对我来说是非常不受欢迎的广告,我希望它能保持整数。
有没有办法执行iloc
以使类型不变?或者最初定义df
以使其尊重每列的类型的方法?
请注意,我更倾向于一种解决方案,它不会假设我事先知道哪些列是整数,哪些列是浮点数。我所知道的是列将存在这两种类型。
编辑:假设我现在想将结果转换为字典:
df = pd.DataFrame()
df = df.append( pd.DataFrame({'i': [0],
'j': [0.3]}), ignore_index=True)
df = df.append( pd.DataFrame({'i': [0],
'j': [0.3]}), ignore_index=True)
df = df.iloc[df['i'].idxmin()].astype(object)
df.astype(object).to_dict()
这给了我{'i': 0.0, 'j': 0.3}
。字典的形式是所希望的,但是,整数现在变成了浮点数。是否可以保留int
- 格式?
答案 0 :(得分:3)
argmin
已被弃用,idxmin
与loc
一起使用。
发生的事情是您使用标量切片并获得系列作为回报。该系列将有一个单一的dtype。而是使用列表或数组进行切片。
# notice the extra set of brackets
df.loc[[df['i'].idxmin()]]
i j
0 0 0.3
这告诉Pandas你想要一个数据帧。
如果您需要argmin
df.iloc[[df['i'].values.argmin()]]
创建字典的最简单方法
dict(next(df.iloc[[df['i'].values.argmin()]].itertuples(index=False))._asdict())
或者
{k: v[0] for k, v in df.iloc[[df['i'].values.argmin()]].items()}
答案 1 :(得分:3)
尝试修复输出
df.iloc[df['i'].idxmin()].astype(object)
Out[1480]:
i 0
j 0.3
Name: 0, dtype: object