[英]Pandas every nth row
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
這種基於算法的采樣能夠實現更復雜的行選擇。
當然,這假設您有一個從 0 開始的有序、連續的整數index
列。
接受的答案有一個更簡單的解決方案,它涉及直接調用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]
將reset_index()
添加到reset_index()
的答案允許您只需要假設行是有序和連續的。
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 遞增的索引,讓您可以輕松使用模數。
我在使用索引時提出的解決方案不可行(可能是多 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.