当前位置: 首页 > 知识库问答 >
问题:

将计数器对象映射到DataFrame以创建新列

包唯
2023-03-14

我有一个踢足球比赛的数据集,我正试图更仔细地观察每个球队在家里踢的比赛。因此,我试图为每支球队创建一个专栏,其中包含跟踪连续获胜的计数器。应适用以下逻辑

  • 如果获胜:增加计数器=1
df[['Date', 'Home', 'Home result']].head()

|      | Date     | Home           | Home result |
| ---- | -------- | -------------- | ----------- |
| 0    | 1/1/2018 | Stoke City     | Defeat      |
| 1    | 1/1/2018 | Brighton       | Tie         |
| 2    | 1/1/2018 | Burnley        | Defeat      |
| 3    | 1/1/2018 | Leicester City | Victory     |

我创建了一个函数,该函数输出一个可以映射到数据帧(按日期排序)的字典,以创建新的计数器列。


    def result_counter(df):
        d = {}
        for index, row in df.iterrows():
            counter = 0
            for second_index, second_row in df.iloc[:index+1].iterrows(): 
                if second_row['Home result'] == 'Victory':
                    counter += 1
                elif second_row['Home result'] == 'Tie':
                    counter += 0
                else:
                    counter -= 1
            if second_row['Home'] not in d:
                d[second_row['Home']] = [counter]
            else:
                d[second_row['Home']].append(counter)
                
        return d

应创建一个新列,指示主队的连续得分。子集的预期结果应如下所示:

|      | Date       | Home      | Home result | Counter |
| ---- | ---------- | --------- | ----------- | ------- |
| 0    | 2017-08-19 | Liverpool | Victory     | 1       |
| 1    | 2017-08-27 | Liverpool | Victory     | 2       |
| 2    | 2017-09-16 | Liverpool | Tie         | 2       |
| 3    | 2017-10-14 | Liverpool | Defeat      | 1       |

我试图将dict映射到新的数据帧。在执行此操作时,我会显示一个map对象或与字典中的键对应的整个列表。

# with subset and map 
sorted_liverpool['Counter'] = map(sorted_liverpool, d)
sorted_liverpool[['Date', 'Home', 'Home result', 'Counter']].head()

|      | Date       | Home      | Home result | Counter                        |
| ---- | ---------- | --------- | ----------- | ------------------------------ |
| 0    | 2017-08-19 | Liverpool | Victory     | <map object at 0x7fc0650fe550> |
| 1    | 2017-08-27 | Liverpool | Victory     | <map object at 0x7fc0650fe550> |
| 2    | 2017-09-16 | Liverpool | Tie         | <map object at 0x7fc0650fe550> |
| 3    | 2017-10-14 | Liverpool | Defeat      | <map object at 0x7fc0650fe550> |
# with subset and map directly to "home" column
sorted_liverpool['Counter'] = sorted_liverpool['Home'].map(d)
sorted_liverpool[['Date', 'Home', 'Home result', 'Counter']].head()

|      | Date       | Home      | Home result | Counter                                           |
| ---- | ---------- | --------- | ----------- | ------------------------------------------------- |
| 0    | 2017-08-19 | Liverpool | Victory     | [1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 6, 7, 7, 8, 9, ... |
| 1    | 2017-08-27 | Liverpool | Victory     | [1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 6, 7, 7, 8, 9, ... |
| 2    | 2017-09-16 | Liverpool | Tie         | [1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 6, 7, 7, 8, 9, ... |
| 3    | 2017-10-14 | Liverpool | Defeat      | [1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 6, 7, 7, 8, 9, ... |

如何将创建的字典映射到DataFrame,使其仅显示列表中的相应值,而不是整个列表?

共有2个答案

米裕
2023-03-14

识别块(重置一些计数器)的常用技术是进行累加和。因此:

undefeat_strikes = df['Home result'].eq('Defeat').cumsum()

然后,您可以在此基础上分组,并在Home resultbeingVictory上进行另一次累积,以计算胜利数:

df['Counter'] = df['Counter'].eq('Victory').groupby([df['Home'], df['Home result']]).cumsum()
陈功
2023-03-14

IIUC,你需要地图,然后计数,

df['Result Value'] = df['Home result'].map({'Victory': 1, 'Tie': 0, 'Defeat': -1})
df.groupby(['Home', 'Home result']).sum()

输出

                       Result Value
Home      Home result              
Liverpool Defeat                 -1
          Tie                     0
          Victory                 2
 类似资料:
  • 让我们假设,我们有样本列表(类型Double){1.5,1.1,2.2,1.0,2.2,3.3}。如何实现将整数作为键(组)并将出现次数作为该贴图值的贴图?对于给定的示例1- 其中windData是保存风速的列表,getSpeed是检索风速值。这种方法生成一组双精度,这意味着它只计算出现次数,我希望得到0-1、1-2、2-3、3-4等组。

  • 在对这个话题进行了大量的测试和研究之后,我无法完全解决我的问题。我正在springboot应用程序中使用modelmapper进行实体/DTO映射。我正在尝试配置modelmapper,将一个集合映射到一个简单的DTO对象。我已经创建了一个自定义转换器,它正在按预期工作: 我现在的问题是将此转换器应用于所有“集合”= 如果我直接在模型映射器中添加转换器,它就是不工作。 你对此有什么提示或解决办法吗

  • 问题内容: 我一直在尝试使用PC上的JSON文件将JSON数据映射到Java对象,但是它总是抛出异常: 我的数据类: 我的映射器类: json文件包含以下数据: 我究竟做错了什么?我正在使用Jackson图书馆。 问题答案: 这是我在您的代码中看到的问题列表: 该属性应放在类之上,而不是类之上。查阅文档,最值得注意的是有关“ ignoreUnknown”属性的说法,默认为false: 公共抽象布尔

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 我有一个POJO旅行者,变量为字符串name,字符串city。我有一个字符串数组,比如 我想要一张地图,上面有名字和城市列表。 我无法给旅行者绘制地图。有没有一种方法可以为旅行者绘制地图,并将其名称作为重点和城市列表。

  • 问题内容: 我有一个具有16个属性的用户类,例如名,姓,dob,用户名,密码等。这些都存储在MySQL数据库中,当我要检索用户时,我使用ResultSet。我想将每个列映射回用户属性,但是我的操作方式似乎效率很低。例如我在做: 即我检索所有列,然后通过将所有列值插入到User构造函数中来创建用户对象。 有谁知道更快,更整洁的方法吗? 问题答案: 无需将resultSet值存储到String中,也无