首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对某些数字之间的索引所在的行求和- Pandas Python

对某些数字之间的索引所在的行求和- Pandas Python
EN

Stack Overflow用户
提问于 2018-02-21 04:01:22
回答 2查看 105关注 0票数 2

我有一个csv,格式如下

代码语言:javascript
运行
复制
       Time     Marker
0       2104    21
1       2109    20
2       2485    21
3       2491    20
4       2867    22
5       2997    2
6       3248    23

我想统计一下Marker==20之间的21,22和23的事件,唯一有效的标记是夹在20个代码之间的,所以前21个是无效的。多个有效标记可以出现在书签标记的20对内,因此我需要在一对20之间出现21、22和23的计数。

因此,在上面的示例中,只有索引2可能是有效代码,因为它介于两个20之间。

我有一个满足Marker==20条件的索引列表

代码语言:javascript
运行
复制
Indexrange = df.index[df['Marker'] == 20].tolist()
[1,
 3,
 10,
 19,
 22,
 25,
 29,
 32,]

如何遍历索引列表并计算每对20的21、22、23的发生率?

到目前为止,我有:

代码语言:javascript
运行
复制
TwentyOnes=0
TwentyTwos=0
TwentyThrees=0

for i in Indexrange:
    for index, row in df.iterrows():
        if index.between(i, i+1):
            if Marker == 21
                Count_of_21s +=
            if Marker == 22
                Count_of_22s +=
            if Marker == 23
                Count_of_23s +=
            else:
                InvalidCount+=

但我得到了

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-16-4a72c2a77924> in <module>()
  5 for i in Indexrange:
  6     for index, row in df.iterrows():
----> 7         if index.between(i,i+1):
  8             print(index, row['Marker'])

AttributeError: 'int' object has no attribute 'between'

如何才能仅获取IndexRange中索引之间的20对之间的值?

期望的输出为: Counts_of_21s = int,Counts_of_22s = int,Counts_of_23s = int,InvalidCount = int

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-21 04:13:32

看起来你需要

代码语言:javascript
运行
复制
df.groupby(df.Marker.eq(20).cumsum()).Marker.value_counts()
Out[1013]: 
Marker  Marker
0       21        1
1       20        1
        21        1
2       2         1
        20        1
        22        1
        23        1
Name: Marker, dtype: int64

更新

代码语言:javascript
运行
复制
df=df.assign(yourid=df.Marker.eq(20).cumsum())
df.loc[(df.yourid<df.yourid.max())&(df.yourid>df.yourid.min())&(df.Marker!=20),:].groupby('yourid').Marker.value_counts()
Out[1021]: 
yourid  Marker
1       21        1
Name: Marker, dtype: int64
票数 4
EN

Stack Overflow用户

发布于 2018-02-21 05:21:40

这是我的解决方案:

代码语言:javascript
运行
复制
import pandas as pd

csv_df = pd.read_csv('between.txt')

markers = csv_df['Marker'].tolist()
indexrange = csv_df.index[csv_df['Marker'] == 20].tolist()
list_dicts = []

for x in range(len(indexrange)-1):
    currentgroup = {'21': markers[indexrange[x]:indexrange[x+1]].count(21),
                    '22': markers[indexrange[x]:indexrange[x+1]].count(22),
                    '23': markers[indexrange[x]:indexrange[x+1]].count(23)
                    }
    list_dicts.append(currentgroup)

i = 1
for list in list_dicts:
    print(f'Grouping {i}', list)
    i = i+1

温的要好得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48893307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档