熊猫每隔n行

2020/11/30 20:51 · python ·  · 0评论

Dataframe.resample()仅适用于时间序列数据。我找不到从非时间序列数据中获取第n行的方法。最好的方法是什么?

我会使用iloc,它根据整数位置并遵循常规python语法获取行/列切片。如果要每第5行:

df.iloc[::5, :]

尽管@chrisb接受的答案确实回答了该问题,但我想在此添加以下内容。

我用来获取nth数据或删除nth行的一种简单方法如下:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

这种基于算术的采样具有实现甚至更复杂的行选择的能力。

当然,假设您有一index从0开始有序,连续的整数

对于接受的答案,有一个甚至更简单的解决方案,它涉及直接调用df.__getitem__

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

例如,要获得每2行,您可以执行

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

还有GroupBy.first/ GroupBy.head,您对索引进行分组:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

索引被步幅(在本例中为2)划分为底数。如果索引是非数字的,请执行

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

我也有类似的要求,但我希望特定组中的第n个物品。这就是我解决的方法。

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]

我在使用索引时提出的解决方案不可行(可能是multi-Gig .csv太大,或者我错过了一些使我能够重新索引而不会崩溃的技术)。

一次遍历一行并将第n行添加到新的数据帧中。

import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

    return df
本文地址:http://python.askforanswer.com/xiongmaomeigenxing.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!