Pandas如何比较 Dataframe 中除了后缀之外名称相同的列是否相等?

eagi6jfj  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(115)

我有一个 Dataframe ,其中包含许多列,格式如下:
| 身份证|列1_df1|列2_df1|第3列_df1|列1_df2|列2_df2|第3列_df2|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| A1|努姆|努姆|努姆|努姆|努姆|努姆|
| A2|努姆|努姆|努姆|努姆|努姆|努姆|
| A3|努姆|努姆|努姆|努姆|努姆|努姆|
| A4|努姆|努姆|努姆|努姆|努姆|努姆|
| A5|努姆|努姆|努姆|努姆|努姆|努姆|
我需要比较前缀前具有相同名称的列。也就是说,我需要比较col1_df1col1_df2col2_df1col2_df2,依此类推。我需要检查每个"重复"列(每个col1、每个col2,依此类推)中的相等百分比。我无法手动执行此操作,因为列太多。
有没有办法使用Pandas功能来实现这一点?
谢谢!

aelbi1ox

aelbi1ox1#

(df.groupby(lambda col: col.rpartition("_")[0], axis="columns")
   .diff().dropna(how="all", axis="columns")
   .eq(0).sum()
   .div(len(df)).mul(100)
   .rename(lambda idx: idx.rpartition("_")[0]))
  • last“_”之前的列名对 Dataframe 进行分组
  • 将每组的差异计入自身
  • 由于每个组的第一列没有任何内容,因此它们将是NaN,因此删除它们
  • 检查差值是否等于0,即重复:求和即计数
  • 然后把它分成百分位
  • 最后获取最终结果的组名(在last _之前

得到类似于(对于某些随机数据)

col1    40.0
col2     0.0
col3    33.3
dtype: float64
rwqw0loc

rwqw0loc2#

既然已经有了一些合理的答案,我将进行猜测,并给予一个略有不同的答案,以防万一它是有用的。
根据您的列名,您似乎是从两个 Dataframe 中获取此 Dataframe 的,这两个 Dataframe 都具有如下列:col1col2等。如果是这种情况,我会后退一步,这样做:

In [33]: df1 = pd.DataFrame(np.random.randint(4, size=(5, 3)),
    ...:       columns=[f"col1", "col2", "col3"],
    ...:       index=["A1", "A2", "A3", "A4", "A5"])

In [34]: df2 = pd.DataFrame(np.random.randint(4, size=(5, 3)),
    ...:       columns=[f"col1", "col2", "col3"],
    ...:       index=["A1", "A2", "A3", "A4", "A5"])

In [35]: df1
Out[35]: 
    col1  col2  col3
A1     0     0     1
A2     3     1     0
A3     0     2     3
A4     1     1     0
A5     3     0     1

In [36]: df2 
Out[36]: 
    col1  col2  col3
A1     1     2     3
A2     3     2     2
A3     3     0     3
A4     0     3     2
A5     2     0     1

In [37]: df2 == df1
Out[37]: 
     col1   col2   col3
A1  False  False  False
A2   True  False  False
A3  False  False   True
A4  False  False  False
A5  False   True   True

In [38]: res = df2 == df1

In [39]: res.sum(axis=0)
Out[39]: 
col1    1
col2    1
col3    2
dtype: int64

要获得以上百分比,您可以执行以下操作:

In [40]: res.sum(axis=0) / len(res) * 100
Out[40]: 
col1    20.0
col2    20.0
col3    40.0
dtype: float64
czq61nw1

czq61nw13#

例如,假设我们有以下 Dataframe :

import pandas as pd

df = pd.DataFrame({'ID': ['A1', 'A2', 'A3', 'A4', 'A5'],
                   'col1_df1': [11, 11, 11, 11, 11],
                   'col2_df1': [10, 11, 12, 13, 14],
                   'col3_df1': [9, 11, 9, 11, 9],
                   'col1_df2': [8, 11, 7, 10, 6],
                   'col2_df2': [7, 8, 9, 10, 11],
                   'col3_df2': [6, 11, 6, 11, 6],
                   })

可视化:

ID  col1_df1  col2_df1  col3_df1  col1_df2  col2_df2  col3_df2
0  A1        11        10         9         8         7         6
1  A2        11        11        11        11         8        11
2  A3        11        12         9         7         9         6
3  A4        11        13        11        10        10        11
4  A5        11        14         9         6        11         6

与使用以下脚本进行比较:

r = (df.groupby(lambda x: x.split('_')[0], axis=1)
     .diff(axis=1)
     .dropna(how='all', axis=1) 
     .rename(columns = {'col1_df2':'diff1', 'col2_df2':'diff2', 'col3_df2':'diff3'}, inplace = False))

那么r就是:

diff1  diff2  diff3
0     -3     -3     -3
1      0     -3      0
2     -4     -3     -3
3     -1     -3      0
4     -5     -3     -3

r中,0表示相等。
在名为diff1r列(比较col1_df1col1_df2)中,我们得到perc为0,如下所示:

perc = float(eval('{0}/{1}'.format(r['diff1'].value_counts()[0], len(r['diff1']))))

print(per)
# 0.2 (ie 1 out of 5)

完整的建议脚本:

import pandas as pd

df = pd.DataFrame({'ID': ['A1', 'A2', 'A3', 'A4', 'A5'],
                   'col1_df1': [11, 11, 11, 11, 11],
                   'col2_df1': [10, 11, 12, 13, 14],
                   'col3_df1': [9, 11, 9, 11, 9],
                   'col1_df2': [8, 11, 7, 10, 6],
                   'col2_df2': [7, 8, 9, 10, 11],
                   'col3_df2': [6, 11, 6, 11, 6],
                   })

r = (df.groupby(lambda x: x.split('_')[0], axis=1)
     .diff(axis=1)
     .dropna(how='all', axis=1) 
     .rename(columns = {'col1_df2':'diff1', 'col2_df2':'diff2', 'col3_df2':'diff3'}, inplace = False))

 
perc = float(eval('{0}/{1}'.format(r['diff1'].value_counts()[0], len(r['diff1']))))

print(per)
# 0.2 (ie 1 out of 5)

相关问题