簡體   English   中英

每 n 行熊貓

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM