获取数据框中不同ID的行值

时间:2018-03-29 10:19:25

标签: python pandas dataframe

我在xlsx文件上过滤了某些ID。将它们转换为数据帧。 ID总数为3。 其中Id1(在xlsx文件中)有5个行值       Id2有3个行值       ID3有19行值

在第一步中,我为每个Id提取了一个行值(行值是我的情况下的时间%H:%M:%S%f,它对每个Id都是唯一的)。

我的数据框看起来像这样:

import pandas as pd 
df = pd.DataFrame([['Id1','01:22:52.134'],['Id2','03:21:31.123'],  ['Id1','21:12:52.544'],['Id3','23:12:31.216'],['Id1','10:22:02.134'],['Id2','06:52:48.184'], ['Id3','12:52:46.188'], ['Id3','06:52:46.184'], ['Id1','13:33:46.235'], ['Id2','14:35:12.235'], ['Id3','14:59:12.177']], columns=["Ids",'Time'])

我的要求是: 我想提取所选Ids的行值,但不是所有行值。 例如: - Id1的1行值(最初包含5)        - Id2的2个行值(最初包含3个)        - Id3的17行值(最初包含19)

2 个答案:

答案 0 :(得分:3)

我建议您使用groupby + pd.concat执行此操作。首先,您需要一个映射:

mapping = {'Id1' : 1, 'Id2' : 2, 'Id3' : 17}

现在,使用mapping仅使用GroupBy.head获取所需的行数:

pd.concat(
    [g.head(mapping[k]) for k, g in df.groupby('Ids')], axis=0
)

    Ids          Time
0   Id1  01:22:52.134
1   Id2  03:21:31.123
5   Id2  06:52:48.184
3   Id3  23:12:31.216
6   Id3  12:52:46.188
7   Id3  06:52:46.184
10  Id3  14:59:12.177

答案 1 :(得分:2)

使用:

ids = {'Id1':1, 'Id2':2, 'Id3':17}
df = df.groupby('Ids', group_keys=False).apply(lambda x: x.head(ids[x.name]))
print (df)
   Ids          Time
0  Id1  01:22:52.134
1  Id2  03:21:31.123
2  Id2  06:52:48.184
3  Id3  23:12:31.216
4  Id3  12:52:46.188
5  Id3  06:52:46.184
6  Id3  14:59:12.177

<强>解释

  1. 首先创建用于映射的字典
  2. 上次groupby,对于每个已过滤的群组,请使用head和字典
  3. 的映射值