【问题标题】:Pandas groupby compare count equal values in 2 columns in excel with subrowsPandas groupby将excel中2列中的计数相等值与子行进行比较
【发布时间】:2020-06-26 12:09:34
【问题描述】:

我有一个这样的 excel 文件:

link

.----.-------------.-------------------------.-----------------.
|    |     ID      | Shareholder - Last name |   DM Cognome    |
:----+-------------+-------------------------+-----------------:
| 1. | 01287560153 | MASSIRONI               | Bocapine Ardaya |
:----+-------------+-------------------------+-----------------:
|    |             | CAGNACCI                |                 |
:----+-------------+-------------------------+-----------------:
| 2. | 05562881002 |                         | Directors       |
:----+-------------+-------------------------+-----------------:
| 3. | 04113870655 | SABATO                  | Sabato          |
:----+-------------+-------------------------+-----------------:
|    |             | VILLARI                 |                 |
:----+-------------+-------------------------+-----------------:
| 4. | 01419190846 | SALMERI                 | Salmeri         |
:----+-------------+-------------------------+-----------------:
|    |             | MICALIZZI               | Lipari          |
:----+-------------+-------------------------+-----------------:
|    |             | LIPARI                  |                 |
'----'-------------'-------------------------'-----------------'

我用 pandas 和ffill ID 列打开这个文件,因为有子行。然后 groupby 按 ID 获取 Shareholder - Last nameDM\nCognome 列上任何相等值的计数。然而我做不到。在这种情况下,结果应该是0 row1 0 row2 1 row3 2 row4

需要注意的是,第 4 行由 3 个子行组成,第 3 行也由 2 个子行组成。(例如)

我有两个问题:

  1. 读取上述无组织的 Excel 文件并进行大量比较、替换值等的最佳方法是什么?
  2. 我怎样才能达到我前面提到的结果。

这是我所做的,但它不起作用:

data['ID'] = data['ID'].fillna(method='ffill')
data.groupby('ID', sort=False, as_index=False)['Shareholder - Last name', 'DM\nCognome'].apply(lambda x: (x['Shareholder - Last name']==x['DM\nCognome']).count())

【问题讨论】:

    标签: python-3.x excel pandas


    【解决方案1】:

    首先,读取表格作为输入(将 ID 保持为字符串而不是浮点数):

    df = pd.read_excel("Workbook1.xlsx", converters={'ID':str})
    df = df.drop("Unnamed: 0", axis=1) #drop this column since it is not useful
    

    填写身份证,如果股东失踪,将 Nan 替换为“失踪”:

    df['ID'] = df['ID'].fillna(method='ffill')
    df["Shareholder - Last name"] = df["Shareholder - Last name"].fillna("missing")
    

    将姓氏转换为小写:

    df["Shareholder - Last name"] = df["Shareholder - Last name"].str.lower()
    

    自定义函数来计算另一列中有多少住户:

    def f(group):
        s = pd.Series(group["DM\nCognome"].str.lower())
        count = 0
        for surname in group["Shareholder - Last name"]:
            count += s.str.count(surname).sum()
        return count
    

    最后得到每个 ID 的计数:

    df.groupby("ID",sort=False)[["Shareholder - Last name", "DM\nCognome"]].apply(lambda x: f(x))
    

    输出:

    ID
    01287560153    0.0
    05562881002    0.0
    04113870655    1.0
    01419190846    2.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多