【问题标题】:How do I iterate through the column of a pandas dataframe and delete rows accordingly? (Jupyter Notebook)如何遍历熊猫数据框的列并相应地删除行? (Jupyter 笔记本)
【发布时间】:2021-10-04 07:42:59
【问题描述】:

这是我现在正在使用的数据框:

Season Team W L W/L% Coaches
1 2020-21 Atlanta Hawks* 41 31 0.569 L. Pierce (14-20) N. McMillan (27-11)
2 2019-20 Atlanta Hawks 20 47 0.299 L. Pierce (20-47)
3 2018-19 Atlanta Hawks 29 53 0.354 L. Pierce (29-53)
4 2017-18 Atlanta Hawks 24 58 0.293 M. Budenholzer (24-58)
5 2016-17 Atlanta Hawks* 43 39 0.524 M. Budenholzer (43-39)
6 2015-16 Atlanta Hawks* 48 34 0.585 M. Budenholzer (48-34)
7 2014-15 Atlanta Hawks* 60 22 0.732 M. Budenholzer (60-22)
8 2013-14 Atlanta Hawks* 38 44 0.463 M. Budenholzer (38-44)
9 2012-13 Atlanta Hawks* 44 38 0.537 L. Drew (44-38)
10 2011-12 Atlanta Hawks* 40 26 0.606 L. Drew (40-26)
11 2010-11 Atlanta Hawks* 44 38 0.537 L. Drew (44-38)
12 2009-10 Atlanta Hawks* 53 29 0.646 M. Woodson (53-29)

我基本上只想有教练的名字从一年到下一年不同的行。例如,我会保留第 4 行,因为它紧邻的第 3 行在“教练”列下具有不同的名称,但我会删除第 5、6 和 7 行,因为“教练”列中的名称与所有三行。但是,我想保留第 8 行,因为第 9 行(相邻行)在“教练”中有不同的名称。

我通过读取 csv 文件得到了这个数据框 df = pd.read_csv("hawks.csv") 我想我应该打电话给df.iloc,但我不知道如何遍历每一行并比较列中的值。到目前为止,我只设法在“教练”列中打印字符串值,如下所示:

coaches = df.iloc[0:, 7]
for name in coaches:
    print(name)

但我想知道当我遍历每一行时如何获取存储在“Coachs”列中的值(然后删除不符合我正在寻找的标准的行)。非常感谢!

【问题讨论】:

    标签: python pandas dataframe loops jupyter-notebook


    【解决方案1】:

    您可以通过将连续行与shift 进行比较来过滤列:

    import pandas as pd
    
    data = [ { "idx": 1, "Season": "2020-21", "Team": "Atlanta Hawks*", "W": 41, "L": 31, "Coaches": "L. Pierce (14-20) N. McMillan (27-11)" }, { "idx": 2, "Season": "2019-20", "Team": "Atlanta Hawks", "W": 20, "L": 47, "Coaches": "L. Pierce (20-47)" }, { "idx": 3, "Season": "2018-19", "Team": "Atlanta Hawks", "W": 29, "L": 53, "Coaches": "L. Pierce (29-53)" }, { "idx": 4, "Season": "2017-18", "Team": "Atlanta Hawks", "W": 24, "L": 58, "Coaches": "M. Budenholzer (24-58)" }, { "idx": 5, "Season": "2016-17", "Team": "Atlanta Hawks*", "W": 43, "L": 39, "Coaches": "M. Budenholzer (43-39)" }, { "idx": 6, "Season": "2015-16", "Team": "Atlanta Hawks*", "W": 48, "L": 34, "Coaches": "M. Budenholzer (48-34)" }, { "idx": 7, "Season": "2014-15", "Team": "Atlanta Hawks*", "W": 60, "L": 22, "Coaches": "M. Budenholzer (60-22)" }, { "idx": 8, "Season": "2013-14", "Team": "Atlanta Hawks*", "W": 38, "L": 44, "Coaches": "M. Budenholzer (38-44)" }, { "idx": 9, "Season": "2012-13", "Team": "Atlanta Hawks*", "W": 44, "L": 38, "Coaches": "L. Drew (44-38)" }, { "idx": 10, "Season": "2011-12", "Team": "Atlanta Hawks*", "W": 40, "L": 26, "Coaches": "L. Drew (40-26)" }, { "idx": 11, "Season": "2010-11", "Team": "Atlanta Hawks*", "W": 44, "L": 38, "Coaches": "L. Drew (44-38)" }, { "idx": 12, "Season": "2009-10", "Team": "Atlanta Hawks*", "W": 53, "L": 29, "Coaches": "M. Woodson (53-29)" } ]
    df = pd.DataFrame(data)
    df[(df['Coaches'].str.split('(').str[0] != df['Coaches'].shift(1).str.split('(').str[0]) | (df['Coaches'].str.split('(').str[0] != df['Coaches'].shift(-1).str.split('(').str[0])]
    

    输出:

    idx Season Team W L Coaches
    0 1 2020-21 Atlanta Hawks* 41 31 L. Pierce (14-20) N. McMillan (27-11)
    2 3 2018-19 Atlanta Hawks 29 53 L. Pierce (29-53)
    3 4 2017-18 Atlanta Hawks 24 58 M. Budenholzer (24-58)
    7 8 2013-14 Atlanta Hawks* 38 44 M. Budenholzer (38-44)
    8 9 2012-13 Atlanta Hawks* 44 38 L. Drew (44-38)
    10 11 2010-11 Atlanta Hawks* 44 38 L. Drew (44-38)
    11 12 2009-10 Atlanta Hawks* 53 29 M. Woodson (53-29)

    我不确定您是否想将 Pierce/McMillan 视为第一次提到 Pierce,我的回答是这样假设的。如果您想将此计为单独的命中,只需将split('(') 替换为rsplit('(', 1)

    【讨论】:

      【解决方案2】:

      遍历数据框:

      it = df.iterrows()  #get iterator
      for index, row in it:
      
          # to delete row
          if cond:
              df.drop([row], inplace=True)
      
      # reset indices if needed
      df.reset_index(drop=True, inplace=True)
      

      【讨论】:

        【解决方案3】:

        你可以使用drop_duplicates方法。

        comp = re.compile(r'[A-Z].\s\w+')
        df['Coaches_Names'] = df['Coaches'].apply(lambda x: ' - '.join(comp.findall(x)))  # New column which includes only coache's names 
        df['Team'] = df['Team'].apply(lambda x: ''.join(re.sub('\*', '', x)))   # Dropping '*' characters from name of teams
            
        df.drop_duplicates(subset=['Team', 'Coaches_Names'], inplace=True)
        
        print(df)
             Season           Team   W   L   W/L%                                Coaches            Coaches_Names
        0   2020-21  Atlanta Hawks  41  31  0.569  L. Pierce (14-20) N. McMillan (27-11)  L. Pierce - N. McMillan
        1   2019-20  Atlanta Hawks  20  47  0.299                      L. Pierce (20-47)                L. Pierce
        3   2017-18  Atlanta Hawks  24  58  0.293                 M. Budenholzer (24-58)           M. Budenholzer
        8   2012-13  Atlanta Hawks  44  38  0.537                        L. Drew (44-38)                  L. Drew
        11  2009-10  Atlanta Hawks  53  29  0.646                     M. Woodson (53-29)               M. Woodson
        

        是否删除Coaches_Names 列由您决定。

        此外,您可以更喜欢使用keep 参数。它允许您在第一年或去年进行选择。有关更多信息,您可以查看文档。 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html

        编辑

        代码被编辑以格式化列,@RJ,Adriaansen

        【讨论】:

        • 这不起作用,因为Coaches 列包含的信息不仅仅是名称。
        猜你喜欢
        • 2021-12-03
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多