在 pandas 中每 4 行读取第 2 个值

read every 2nd value every 4 rows in pandas

提问人:Mireia 提问时间:10/21/2023 最后编辑:Mireia 更新时间:10/21/2023 访问量:36

问:

我试图只读取我的 excel 数据表每 4 行的值(对应于“媒体”的每个值)。我可以这样做,但我想从第 4 行开始每 2 行阅读一次。或者从技术上讲,它将是第 2 行和第 6 行和第 10 行等。但无论我怎么尝试,我都无法得到我想要的。Excel 数据文件

我尝试了从不同问题中发现的变体:

cols=[' estacion_id','estacion_nombre','sensor_id','sensor_alias','sensor_nombre','fecha_ observacio n','metrica','valor' ]  
f=pd.read_csv('env_picacho-ma_2013.csv', usecols=['fecha_observacion', 'valor'])

date=pd.read_csv('env_picacho-ma_2013.csv', usecols=['fecha_observacion'],skiprows=lambda x: logic(x)  )
temp=pd.read_csv('env_picacho-ma_2013.csv', usecols=['valor'],skiprows= lambda x:(x % 4))

这给了我每 4 行: 勇气 0 7.7 1 8.4 2 4.7 3 6.8 4 8.2 ... ... 1820 791.0 1821 771.0 1822 841.0 1823 806.0 1824 795.0

我也试过:

def logic(index=0):

if index % 4 == 3:
    return True

return False

temp=pd.read_csv('env_picacho-ma_2013.csv', usecols=['valor'],skiprows= lambda x: logic(x))

这将跳过 4 行中的每 3 行。所以我想我可以跳过每一行 1 和每一行 3 和每一行 4 以只保留第 2 行。但这也行不通:

def logic(index=0):

if index % 4 == 3 and index % 4== 2:
    return True

return False

再次给了我所有的价值观。我有点理解为什么这行不通,因为我与 myslef 相矛盾,但我不知道如何正确地做到这一点:

        valor

0 氮 1 3.78417 2 0.60000 3 7.70000 4 氮 ... ... 7295 806.00000 7296 20382.00000 7297 钠 7298 钠 7299 795.00000

然后我找到了这个,它每 5 行选择每个前 2 个值,但我不知道如何为我的情况修改它(每 2 行每 4 个值):

df.groupby(df.index//5).head(2)

我尝试了很多变体,我想我的另一个选择要么是循环,但我在编码循环方面很糟糕,所以如果有人能提供任何建议,将不胜感激。 我想要的是: 勇气 0 3.78417 1 4.48482 2 2.38661 ...

pandas row read-csv

评论


答:

1赞 Daniel Wyatt 10/21/2023 #1

使用以下公式跳过除第一行(标题)和不符合模式 2、6、10、14 的行之外的每一行怎么样?

def logic(index=0):
    if index==0: # keep the header row
        return False
    if (index+2) % 4 == 0: # keep every 4th row starting from row 2
        return False
    return True

date = pd.read_csv('env_picacho-ma_2013.csv', usecols=['fecha_observacion'],skiprows=lambda x: logic(x))
1赞 Timeless 10/21/2023 #2

我试图只阅读......(对应于“media”的每个值)。

您可以使用:

SR, GAP = 2, 3

df = pd.read_csv("env_picacho-ma_2013.csv", # add more params if needed
                 skiprows=lambda i: (i+SR)%(GAP+1) and i!=0)

输出:

print(df)

    estacion_id estacion_no  sensor_id  ... fecha_observacion metrica valor
0            90  PICACHO_MA        225  ...        01/01/2013   media  3.78
1            90  PICACHO_MA        225  ...        02/01/2013   media  4.48
2            90   PICACHO_M        225  ...        03/01/2013   media  2.39
3            90  PICACHO_M.        225  ...        04/01/2013   media  3.18
4            90  PICACHO_M.        225  ...        05/01/2013   media  3.86
5            90  PICACHO_MA        225  ...        06/01/2013   media  2.27
6            90  PICACHO_MA        225  ...        07/01/2013   media  2.42
7            90  PICACHO_MA        225  ...        08/01/2013   media  0.89
8            90  PICACHO_M.        225  ...        09/01/2013   media  2.07
9            90  PICACHO_M.        225  ...        10/01/2013   media  2.90
10           90   PICACHO M        225  ...        11/01/2013   media  3.95

中间体(可调用) :

index  0 # --> False (don't skip)
index  1 # -->  True
index  2 # --> False (don't skip)
index  3 # -->  True
index  4 # -->  True
index  5 # -->  True
index  6 # --> False (don't skip)
index  7 # -->  True
index  8 # -->  True
index  9 # -->  True
index 10 # --> False (don't skip)
index 11 # -->  True
index 12 # -->  True
index 13 # -->  True
index 14 # --> False (don't skip)
index 15 # -->  True
index 16 # -->  True
index 17 # -->  True
index 18 # --> False (don't skip)
...

评论

0赞 Mireia 10/23/2023
两个答案都很好,谢谢!然后我认为在实现条件之前,添加一个条件来跳过 1061 的第一行是很容易的,因为第 1062 行到 2921 行每 4 行跳过一次,然后跳过第 2922 行结束(基本上使用 nrows),但我似乎又做错了。它从第 2 行开始。这是我在此解决方案中更改的内容:SR1,GAP1 = 1062,3。 我尝试向另一个解决方案的 def 逻辑添加一个条件,但问题相同。
1赞 Timeless 10/23/2023
不客气,但是当您谈论(作为索引)时,您是指 csv(行号)中的物理位置还是行位置,还是 pandas 的索引?这是模棱两可的!无论如何,你可以试试这个:。您可能需要使用 调整区间的一条边(或两条边)。1061skiprows=lambda i: i%4 if (i==0 or 1061 < i < 2921) else True)+-1