Mix*_*xel 85 python resampling pandas
Dataframe.resample()仅适用于时间序列数据.我找不到从非时间序列数据中获取每一行的方法.什么是最好的方法?
chr*_*isb 145
我使用iloc
,它采用行/列切片,基于整数位置和遵循正常的python语法.
df.iloc[::5, :]
Run Code Online (Sandbox Code Playgroud)
met*_*leB 22
虽然@ 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
Run Code Online (Sandbox Code Playgroud)
这种基于算术的采样能够实现更复杂的行选择.
当然,这假定您有一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
Run Code Online (Sandbox Code Playgroud)
例如,要获取每 2 行,您可以执行
df[::2]
a b c
0 x x x
2 x x x
4 x x x
Run Code Online (Sandbox Code Playgroud)
还有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
Run Code Online (Sandbox Code Playgroud)
索引按步幅(在本例中为 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
Run Code Online (Sandbox Code Playgroud)
小智 8
添加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
Run Code Online (Sandbox Code Playgroud)
df.reset_index().index
将创建一个从 0 开始并以 1 递增的索引,使您可以轻松使用模数。