Python 2.7 选择“切片”,然后在列上映射函数

Python 2.7 选择“切片”,然后在列上映射函数,python-2.7,pandas,dataframe,slice,Python 2.7,Pandas,Dataframe,Slice,我有一个csv数据库,我正试图使用k-匿名“清理”(用*替换私人信息)。我试图选择一组跨多个列具有相同值的行。如果有足够多的行,我想改变这些行的列值。目前我有 subset= df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc), :] if subset.shape[0] < k : subset['Date of birth'] = subset[

我有一个csv数据库,我正试图使用k-匿名“清理”(用*替换私人信息)。我试图选择一组跨多个列具有相同值的行。如果有足够多的行,我想改变这些行的列值。目前我有

subset= df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc), :]
if subset.shape[0] < k :
    subset['Date of birth'] = subset['Date of birth'].apply(lambda db: f(db))
不知道如何解决这个问题?我可以重复查找行,而不是将其存储在变量中,但这将被分配运行时间,并希望它尽可能快

此代码也不会修改数据帧中的值

我把密码改成

num_with_all = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc)].shape[0]
if num_with_all < k:
    df.ix[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc), 'Date of birth'] = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc), 'Date of birth'].apply(lambda bd: f(bd))
进入


只有一些行的出生日期被*替换了一些数字。

如果提供了数据,就容易多了

执行时间检查表:

  • df.loc[…]df.ix[…]=df.loc[…]apply(lamda:)
    循环100次-模拟0:00:02.225785中的1600条记录
    问题中的代码

  • loc[…]应用(lamda:series)
    循环100次-模拟0:00:00.757525中的1600条记录

    def f2(series):
        df.loc[series.name, 'Date of birth'] = '**' + series['Date of birth'][2:]
        return series
    
    query_df = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc)]
    
    if len(query_df) < k:
        query_df.apply(lambda series: f2(series), axis=1)
    

    使用Python:3.4.2进行测试-pandas:0.19.2

    如果提供了可供使用的数据,那么就更容易了

    执行时间检查表:

  • df.loc[…]df.ix[…]=df.loc[…]apply(lamda:)
    循环100次-模拟0:00:02.225785中的1600条记录
    问题中的代码

  • loc[…]应用(lamda:series)
    循环100次-模拟0:00:00.757525中的1600条记录

    def f2(series):
        df.loc[series.name, 'Date of birth'] = '**' + series['Date of birth'][2:]
        return series
    
    query_df = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc)]
    
    if len(query_df) < k:
        query_df.apply(lambda series: f2(series), axis=1)
    

    使用Python:3.4.2测试-pandas:0.19.2

    您建议的内容不允许我编辑行中的特定列,或者至少idk如何编辑。我尝试了subset=subset[anon\u col\u name].apply(lambda db:anon\u map\u func(db)),但这没有正确设置原始dfYes中的值,但性别和邮政编码似乎都消失了。这样做的目的是让这些栏目保持不变,只标注出生日期。我可能只是误解了输出。试过了,还是不起作用。我发现的问题是,当我只想编辑df中的一个子集时,.apply函数似乎编辑了df中的所有行。“打印(df[df['Date'].str.contains(“*”)).to_string())打印(df[df['Date'].str.contains(“*”).shape)”并没有得到任何结果您的答案似乎与原始数据框相同,并更改了原始数据框中所有行的“Date of birth”列值。我想要的是首先查询哪些行与特定条件匹配。如果存在足够多的行,那么我只想对原始数据帧中的行子集应用更改。我添加到问题中的示例应该提供一个示例您所建议的内容不允许我编辑行中的特定列,或者至少idk how to。我尝试了subset=subset[anon\u col\u name].apply(lambda db:anon\u map\u func(db)),但这没有正确设置原始dfYes中的值,但性别和邮政编码似乎都消失了。这样做的目的是让这些栏目保持不变,只标注出生日期。我可能只是误解了输出。试过了,还是不起作用。我发现的问题是,当我只想编辑df中的一个子集时,.apply函数似乎编辑了df中的所有行。“打印(df[df['Date'].str.contains(“*”)).to_string())打印(df[df['Date'].str.contains(“*”).shape)”并没有得到任何结果您的答案似乎与原始数据框相同,并更改了原始数据框中所有行的“Date of birth”列值。我想要的是首先查询哪些行与特定条件匹配。如果存在足够多的行,那么我只想对原始数据帧中的行子集应用更改。我在问题中添加的示例应该提供一个示例
        Name    Gender  Date of birth   Telephone   Postal code Disease
    0   *************   M   **-7-1981   ************    N2L 6B5 Avian Influenza
    1   *********** F   **-11-1976  *********** N2L 4T6 Human Pulmonary Syndrome (HPS)
    2   *************** F   *-3-1962    ************    N2L 1L9 Chlamydial infection
    3   *************** F   **-8-1967   ************    N2L 4M5 Dandy fever
    4   ****************    F   19-3-1963   ************    N2L 2L1 Chlamydial infection
    5   ************    F   2-2-1979    ************    N2L 5J1 Scarlet fever
    6   *********** M   **-1-1985   *********** N2L 1S6 Scarlet fever
    7   *********** M   *-6-1977    ************    N2L 2Q9 Chlamydia
    8   *************** F   9-11-1987   ************    N2L 7H9 Chlamydia
    9   *****************   M   *-7-1989    ************    N2L 3B1 SARS- Severe Acute Respiratory Syndrome
    10  *********** M   1-3-1969    ************    N2L 6N9 Malaria
    11  **************  M   21-4-1990   ************    N2L 0B0 North American blastomycosis
    12  *************** F   *-12-1964   ************    N2L 7F6 Chlamydia
    13  **********  M   **-7-1960   ************    N2L 3P3 Chickenpox
    14  ******************  F   11-10-1972  *********** N2L 6E4 Diphtheria
    15  **************  M   **-12-1988  ************    N2L 1T4 SARS- Severe Acute Respiratory Syndrome
    
    def f2(series):
        df.loc[series.name, 'Date of birth'] = '**' + series['Date of birth'][2:]
        return series
    
    query_df = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc)]
    
    if len(query_df) < k:
        query_df.apply(lambda series: f2(series), axis=1)
    
    query_df = df.loc[(df['Gender'] == g) & (df['Date of birth'] == bd) & (df['Postal code'] == pc)]
    if len(query_df) < k:
        for idx in query_df.index:
            df.loc[idx, 'Date of birth'] = '**' + df.loc[idx, 'Date of birth'][2:]
    
                   Name Gender Date of birth     Telephone Postal code
    0     *************      M     18-7-1981  ************     N2L 6B5
    1       ***********      F    **-11-1976   ***********     N2L 4T6
    2   ***************      F      4-3-1962  ************     N2L 1L9
    3   ***************      F     10-8-1967  ************     N2L 4M5
    4  ****************      F     19-3-1963  ************     N2L 2L1