我有3个数据帧,如下所示

ID,col1,col2
1,X,35
2,X,37
3,nan,32
4,nan,34
5,X,21
df1 = pd.read_clipboard(sep=',',skipinitialspace=True)

ID,col1,col2
1,nan,305
2,X,307
3,X,302
4,nan,304
5,X,201
df2 = pd.read_clipboard(sep=',',skipinitialspace=True)

ID,col1,col2
1,X,315
2,nan,317
3,X,312
4,nan,314
5,X,21
df3 = pd.read_clipboard(sep=',',skipinitialspace=True)

现在我想在所有3个输入数据帧中识别IDs,其中col1NA.

所以,我try 了下面的方法

L1=df1[df1['col1'].isna()]['ID'].tolist()
L2=df2[df2['col1'].isna()]['ID'].tolist()
L3=df3[df3['col1'].isna()]['ID'].tolist()
common_ids_all = list(set.intersection(*map(set, [L1,L2,L3])))
final_df = pd.concat([df1,df2,df3],ignore_index=True)
final_df[final_df['ID'].isin(common_ids_all)]

虽然上述方法有效,但有没有有效且优雅的方法来实现上述目的?

正如你所看到的,我重复同一条语句三次(对于3个数据帧)

然而,在我的真实数据中,我有12个数据帧,我必须得到ID,其中col1是所有12个数据帧中的NA.

update - my current read operation looks like below

fnames = ['file1.xlsx','file2.xlsx', 'file3.xlsx']
dfs=[]
NA_list=[]
def preprocessing(fname):
    df= pd.read_excel(fname, sheet_name="Sheet1")
    df.columns = df.iloc[7]
    df = df.iloc[8: , :]
    NA_list.append(df[df['col1'].isna()]['ID'])
    dfs.append(df)
[preprocessing(fname) for fname in fnames]
final_df = pd.concat(dfs, ignore_index=True)
L1 = NA_list[0]
L2 = NA_list[1]
L3 = NA_list[2]
final_list = (list(set.intersection(*map(set, [L1,L2,L3]))))
final_df[final_df['ID'].isin(final_list)]

推荐答案

你可以使用:

dfs = [df1, df2, df3]
final_df = pd.concat(dfs).query('col1.isna()')
final_df = final_df[final_df.groupby('ID')['ID'].transform('size') == len(dfs)]
print(final_df)

# Output
   ID col1  col2
3   4  NaN    34
3   4  NaN   304
3   4  NaN   314

完整代码:

fnames = ['file1.xlsx','file2.xlsx', 'file3.xlsx']

def preprocessing(fname):
    return pd.read_excel(fname, sheet_name='Sheet1', skiprows=6)

dfs = [preprocessing(fname) for fname in fnames]
final_df = pd.concat([df[df['col1'].isna()] for df in dfs])
final_df = final_df[final_df.groupby('ID')['ID'].transform('size') == len(dfs)]

Python相关问答推荐

使用SKLearn KMeans和外部生成的相关矩阵

在Python中根据id填写年份系列

如何在Power Query中按名称和时间总和进行分组

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

删除pandas rame时间序列列中未更改的值

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

无法导入已安装的模块

使用图片生成PDF Django rest框架

如何销毁框架并使其在tkinter中看起来像以前的样子?

Pandas :多索引组

通过仅导入pandas来在for循环中进行多情节

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

rame中不兼容的d类型

Pytest两个具有无限循环和await命令的Deliverc函数

如何删除索引过go 的lexsort深度可能会影响性能?' &>

优化pytorch函数以消除for循环

Python解析整数格式说明符的规则?

移动条情节旁边的半小提琴情节在海运

Polars asof在下一个可用日期加入

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突