Pandas->Styler:当两行或更多行的单元格具有相同值时隐藏特定单元格

Pandas->Styler: Hide specific cells when two or more rows have cells with the same value

我在以下数据框中有三行描述同一个人,但手机不同:

data = {'Name':['tom', 'tom', 'tom', 'nick', 'krish', 'jack'],
        'Age':[20, 20, 20, 21, 19, 18],
        'Phone':[1234, 2345, 4576, 7890, 6767, 7676]}
df = pd.DataFrame(data)
In [16]: df
Out[16]:
    Name  Age  Phone
0    tom   20   1234
1    tom   20   2345
2    tom   20   4576
3   nick   21   7890
4  krish   19   6767
5   jack   18   7676

我想生成 html,其中样式被定义为隐藏以下匹配行中的重复单元格,只留下差异:

table_output

Name    Age  Phone
tom     20   1234
             2345
             4576
nick    21   7890
krish   19   6767
jack    18   7676

我怎样才能:

  1. 识别重复值(我正在使用以下 PSB,但也许有更好的方法)
  2. 像上面的 table_output 那样将它们隐藏在 Styler 对象中?
In [22]: df.duplicated("Name")
Out[22]:
0    False
1     True
2     True
3    False
4    False
5    False
dtype: bool

In [23]: df.duplicated("Age")
Out[23]:
0    False
1     True
2     True
3    False
4    False
5    False
dtype: bool

我已经成功创建了

df_dup = df[df["Name"].duplicated()]
df_dup.style.hide_columns([0,1])

但我无法将 df 与 df_dup -> 风格相交..

谢谢。

在 Jupyter notebook 中使用以下数据框:

import pandas as pd

df = pd.DataFrame(
    data={
        "Name": ["tom", "tom", "tom", "nick", "krish", "jack"],
        "Age": [20, 20, 20, 21, 19, 18],
        "Phone": [1234, 2345, 4576, 7890, 6767, 7676],
    }
)
df

输出

你可以这样做:

def mask_values(val):
    return f"opacity: {0}"


df.style.applymap(
    mask_values,
    subset=(
        df[df.duplicated(subset=["Name", "Age"], keep="first")].index,
        ["Name", "Age"],
    ),
)

输出

您可以检查下面的数据帧是否未更改:

df.loc[0, "Name"]  # Output: 'tom'