Python 数据帧检查条件是否与对应值匹配

Python 数据帧检查条件是否与对应值匹配,python,dataframe,Python,Dataframe,假设我有一个数据帧,如: print(df) category size large 100 small 10 medium 50 small 10 medium 40 large 120 我想在类别和大小之间检查大小是否具有与类别对应的精确值 large == 100, medium == 50 and small == 10. 我想使用以下给定的语法: for df_index, df_line in df.iterrow

假设我有一个数据帧,如:

    print(df)

    category size
    large 100
    small 10
    medium 50
    small 10
    medium 40
    large 120
我想在类别和大小之间检查大小是否具有与类别对应的精确值

large == 100, medium == 50 and small == 10.
我想使用以下给定的语法:

for df_index, df_line in df.iterrows():
如果一行有不匹配,那么离开该行,否则,删除一个匹配良好的行。 输出应如下所示: 打印(df)


即使您要求使用
iterrows
解决方案,我也会给您一种不使用它的方法。
iterrows
方法非常容易使用,但会导致不可伸缩的代码,因为在pandas中这是一个昂贵的操作。尽可能多地,您应该尝试使用使用C优化代码的矢量化方法。在这里,您可以:

  • 构建参考数据框架

    ref = pd.DataFrame([['large', 100], ['medium', 50], ['small', 10]],
               columns=df.columns)
    
  • 将其合并到原始数据帧中,并保留值不匹配的行:

    df.merge(ref, how='left', on='category', suffixes=('', '_ref')).query(
        "size != size_ref")[['category', 'size']]
    
  • 正如预期的那样:

      category  size
    4   medium    40
    5    large   120
    

    即使您要求使用
    iterrows
    解决方案,我也会给您一种不使用它的方法。
    iterrows
    方法非常容易使用,但会导致不可伸缩的代码,因为在pandas中这是一个昂贵的操作。尽可能多地,您应该尝试使用使用C优化代码的矢量化方法。在这里,您可以:

  • 构建参考数据框架

    ref = pd.DataFrame([['large', 100], ['medium', 50], ['small', 10]],
               columns=df.columns)
    
  • 将其合并到原始数据帧中,并保留值不匹配的行:

    df.merge(ref, how='left', on='category', suffixes=('', '_ref')).query(
        "size != size_ref")[['category', 'size']]
    
  • 正如预期的那样:

      category  size
    4   medium    40
    5    large   120
    

    这是一个基于你的问题;这很基本,但很容易理解:

    import pandas as pd
    
    size_chart = {'large':100, 'medium': 50, 'small': 10}
    data = {'category': ['large', 'small', 'medium', 'small', 'medium', 'medium'], 'size': [100, 10, 50, 10, 50, 100] } 
    df = pd.DataFrame (data, columns = ['category','size'])
    rows_list = []
    for df_index, df_line in df.iterrows():
        if df_line['size'] != size_chart[df_line['category']]: rows_list.append( {'category':df_line['category'],'size':df_line['size']} )
    df2 = pd.DataFrame (rows_list, columns = ['category','size'])
    print (df2)
    
    印刷品:

      category  size
    0   medium   100
    

    这是一个基于你的问题;这很基本,但很容易理解:

    import pandas as pd
    
    size_chart = {'large':100, 'medium': 50, 'small': 10}
    data = {'category': ['large', 'small', 'medium', 'small', 'medium', 'medium'], 'size': [100, 10, 50, 10, 50, 100] } 
    df = pd.DataFrame (data, columns = ['category','size'])
    rows_list = []
    for df_index, df_line in df.iterrows():
        if df_line['size'] != size_chart[df_line['category']]: rows_list.append( {'category':df_line['category'],'size':df_line['size']} )
    df2 = pd.DataFrame (rows_list, columns = ['category','size'])
    print (df2)
    
    印刷品:

      category  size
    0   medium   100
    

    期望的输出是什么?@AlexandreB。添加了所需的输出,但仍不清楚您想要的输出是什么。只需列出所需的输出。所需的输出是什么?@AlexandreB。添加了所需的输出,但仍不清楚您想要的输出是什么。只需列出所需的输出。感谢您的其他观点。正如你所说,iterrows需要更多的计算能力,但我需要这个方法用于其他目的。我正在考虑使用字典,例如size_dict={small:10,medium:50,large:100}。我能用这个方法坚持使用iterrows方法吗?谢谢你的另一个观点。正如你所说,iterrows需要更多的计算能力,但我需要这个方法用于其他目的。我正在考虑使用字典,例如size_dict={small:10,medium:50,large:100}。我能用这个方法坚持使用iterrows方法吗?非常有用:)非常有用:)