Dataframe.resample()仅适用于时间序列数据。我找不到从非时间序列数据中获取每一行的方法。什么是最好的方法?
答案 0 :(得分:119)
我使用iloc
,它采用行/列切片,两者都基于整数位置并遵循正常的python语法。
df.iloc[::5, :]
答案 1 :(得分:15)
虽然@ 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开始。
答案 2 :(得分:1)
对于已接受的答案,有一个甚至更简单的解决方案,涉及直接调用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
答案 3 :(得分:1)
将 reset_index()
添加到 metastableB's answer 允许您只需要假设行是有序且连续的。
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 递增的索引,让您可以轻松使用模数。
答案 4 :(得分:0)
我也有类似的要求,但是我想要特定组中的第n个物品。这就是我解决的方法。
groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
答案 5 :(得分:0)
我使用索引时提出的解决方案不可行(可能是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
答案 6 :(得分:0)
df.drop(labels=df[df.index % 3 != 0].index, axis=0) # every 3rd row (mod 3)