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方法吗?非常有用:)非常有用:)