【问题标题】:How to create pandas dataframe column loop on two other columns?如何在另外两列上创建熊猫数据框列循环?
【发布时间】:2021-12-23 15:21:00
【问题描述】:

我有一个 Pandas 数据框,不知道如何做我希望做的事情。这是数据帧的 sn-p,我也在上传 screenshot。实际上,我想创建一个新列,定义为计数为“3--2”的音高。

为此,我想遍历所有行。对于给定的行(我将其称为原始行),如果 prev_count == '3--2' 我想要

  1. 将数据帧行降级到prev_count != '3--2'
  2. 确认该行与原始行具有相同的 batter-pitcher 标识符
  3. 连续一次满足条件prev_count != '3--2' AND batter-pitcher(原始行) == batter-pitcher(新行),我想提取新行的pitch_number
  4. 然后将使用以下公式计算原始行中新列的值:

pitch_number(原行)+ 1 - pitch_number(新行)

以现有数据框为例...索引 62、4、186、87 和 252 的新列的值为 1。索引 171 的值为 3; 177 值为 2; 192 的值为 1。同样,191 的值为 5;对于这个新列变量,229、10 和 57 的值也将为 1。

            player_name   batter-pitcher  pitch_number count prev_count
62   Graveman, Kendall  501303---608665             6  3--2       3--1
4          Smyly, Drew  608665---592767             6  3--2       2--2
186  Graveman, Kendall  592696---608665             8  3--2       2--2
87         Maton, Phil  621020---664208             6  3--2       3--1
252      Martin, Chris  514888---455119             6  3--2       2--2
171      Urquidy, José  624585---664353             8  3--2       3--2
177      Urquidy, José  624585---664353             7  3--2       3--2
192      Urquidy, José  624585---664353             6  3--2       3--1
191       García, Yimi  594807---554340            12  3--2       3--2
198       García, Yimi  594807---554340            11  3--2       3--2
209       García, Yimi  594807---554340            10  3--2       3--2
219       García, Yimi  594807---554340             9  3--2       3--2
229       García, Yimi  594807---554340             8  3--2       2--2
10     Valdez, Framber  592696---664285             6  3--2       2--2
57     Valdez, Framber  518692---664285             6  3--2       2--2

对于如何 1) 循环遍历数据帧上的行,然后 2) 在循环的每个块中,降低行和 3) 在另一行中引用数据帧中的其他列,我有点不知所措,所以非常感谢这里的一些指导。非常感谢!

【问题讨论】:

    标签: python pandas dataframe loops


    【解决方案1】:

    对于您给定的数据集,我认为这是可行的。但它假设你的音高计数总是加一并且你没有丢失任何数据,否则这将不起作用。我建议研究一下投手击球手上的 cumcount()、cummax()、cummin() 分组。

    'new1' 列是最终答案,'new' 列只是一个中间步骤。

    # get dataframe into right order
    df.sort_values(by=['batter-pitcher', 'pitch_number'], ascending=[True, False], inplace=True)
    
    
    df['new'] = df.groupby(['batter-pitcher', 'prev_count'])['count'].cumcount(ascending=False) + 1
    
    df['new1'] = np.where((df['new']==1) & (df['prev_count']!='3--2'), 1, df['new']+1)
    
               player_name   batter-pitcher  pitch_number count prev_count  new  new1
    62   Graveman, Kendall  501303---608665             6  3--2       3--1    1     1
    4          Smyly, Drew  608665---592767             6  3--2       2--2    1     1
    186  Graveman, Kendall  592696---608665             8  3--2       2--2    1     1
    87         Maton, Phil  621020---664208             6  3--2       3--1    1     1
    252      Martin, Chris  514888---455119             6  3--2       2--2    1     1
    171      Urquidy, José  624585---664353             8  3--2       3--2    2     3
    177      Urquidy, José  624585---664353             7  3--2       3--2    1     2
    192      Urquidy, José  624585---664353             6  3--2       3--1    1     1
    191       García, Yimi  594807---554340            12  3--2       3--2    4     5
    198       García, Yimi  594807---554340            11  3--2       3--2    3     4
    209       García, Yimi  594807---554340            10  3--2       3--2    2     3
    219       García, Yimi  594807---554340             9  3--2       3--2    1     2
    229       García, Yimi  594807---554340             8  3--2       2--2    1     1
    10     Valdez, Framber  592696---664285             6  3--2       2--2    1     1
    57     Valdez, Framber  518692---664285             6  3--2       2--2    1     1
    

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2015-09-12
      • 2023-03-27
      • 2015-07-02
      • 2019-01-25
      • 1970-01-01
      • 2021-06-08
      • 2021-09-29
      • 1970-01-01
      相关资源
      最近更新 更多