提取行

时间:2018-04-06 14:28:19

标签: python pandas

我有一个数据框,我追加几行来包含不同类型的元素(浮点数或整数):

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 - 格式?

2 个答案:

答案 0 :(得分:3)

argmin已被弃用,idxminloc一起使用。

发生的事情是您使用标量切片并获得系列作为回报。该系列将有一个单一的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