每隔一排都有熊猫

Dataframe.resample()只能处理时间序列数据。我找不到从非时间序列数据中获取每个 n 行的方法。最好的方法是什么?

200017 次浏览

我将使用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开始。

我有类似的要求,但我想要特定组中的第n项。我就是这样解出来的。

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

对于已接受的答案,还有一个更简单的解决方案,它涉及直接调用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

索引由stride(在本例中为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
我在使用索引时提出的解决方案是不可行的(可能是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
df.drop(labels=df[df.index % 3 != 0].index, axis=0) #  every 3rd row (mod 3)

reset_index()添加到metastableB的回答允许你只需要假设行是有序连续

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

df.reset_index().index将创建一个从0开始,以1为增量的索引,允许您轻松使用模数。