Skip to main content

A lightweight library for anonymizing and transforming data in pandas DataFrames, including masking, suppression, perturbation, permutation, generalization, and pseudonymization.

Project description

df-anonymizer

A lightweight Python library designed to apply privacy-preserving transformations on datasets in pandas.DataFrame format.
It is ideal for preparing data for research, analysis, reporting or machine learning while protecting sensitive personal information.

✨ Key Features

  • Masking: Mask email addresses and identification numbers
  • Pseudonymization: Generate unique pseudonyms with key mapping table
  • Data perturbation: Add privacy noise to age, weight, height, etc.
  • Data generalization: Bucket or reduce granularity for numeric and date values
  • Suppression: Remove sensitive columns or filter out specific records
  • Shuffling: Randomly reorder rows
  • Evaluation: Compute the k-anonymity score for your dataset

All functions are optimized to work with pandas.DataFrame structures.

📦 Installation

pip install df-anonymizer

👉 Example

📌 Pseudonymization

import pandas as pd
from df_anonymizer import pseudonymization

df = pd.DataFrame({'NRIC': ['S1234567A', 'S2345678B', 'S3456789C']})
anon_df = pseudonymization(df, 'NRIC')
print(anon_df)

# Example output:
#        NRIC
# 0  abcd123456
# 1  efgh234567
# 2  ijkl345678

📌 Masking

from df_anonymizer import maskID, maskEmail

df_mask = pd.DataFrame({
    'ID': ['123456789', '987654321'],
    'Email': ['alice@example.com', 'bob@example.com']
})
df_mask = maskID(df_mask, 'ID')
df_mask = maskEmail(df_mask, 'Email')
print(df_mask)

# Output:
#          ID              Email
# 0     ******789     a****@example.com
# 1     ******321     b**@example.com

📌 Data Perturbation

from df_anonymizer import (
    agePerturbation, weightPerturbation, heightPerturbation,
    dataPerturbation, datePerturbation
)

df_perturb = pd.DataFrame({
    'Age': [25, 34, 57],
    'Weight': [58.4, 72.1, 80.5],
    'Height': [163.2, 177.5, 170.0],
    'Score': [81, 92, 87],
    'Date': pd.to_datetime(['2023-01-01', '2023-01-15', '2023-02-01'])
})

df_perturb = agePerturbation(df_perturb, 'Age')
df_perturb = weightPerturbation(df_perturb, 'Weight')
df_perturb = heightPerturbation(df_perturb, 'Height')
df_perturb = dataPerturbation(df_perturb, 'Score', base_number=10)
df_perturb = datePerturbation(df_perturb, 'Date', max_days=7)

print(df_perturb)

# Output:
#    Age  Weight  Height  Score       Date
# 0   24    57.0     160     80 2022-12-30
# 1   33    72.0     175     90 2023-01-17
# 2   57    78.0     170     80 2023-01-25

📌 Data Generalization

from df_anonymizer import dateGeneralization, meanGeneralization, dataBucketing

df_gen = pd.DataFrame({
    'DOB': pd.to_datetime(['1990-01-01', '1995-05-15']),
    'Income': [2000, 4500, 7800],
    'Age': [22, 35, 47]
})

df_gen = dateGeneralization(df_gen, 'DOB', verbose=False)
df_gen = meanGeneralization(df_gen, 'Income', bins=3)
df_gen = dataBucketing(df_gen, 'Age', bins=[0, 30, 60], labels=['Young', 'Adult'])
print(df_gen)

# Output:
#     DOB  Income    Age
# 0  1990    1750  Young
# 1  1995    4750  Adult
# 2  1995    7750  Adult

📌 Suppression

from df_anonymizer import attributeSuppression, recordSuppression

df_sup = pd.DataFrame({
    'Name': ['Alice', 'Bob'],
    'Age': [25, 40],
    'City': ['SG', 'NY']
})

df_sup = attributeSuppression(df_sup, ['Name'])
print(df_sup)

# Output:
#    Age City
# 0   25   SG
# 1   40   NY

df_sup = recordSuppression(df_sup, ['City'], [['NY']])
print(df_sup)

# Output:
#    Name   Age City
# 0  Alice  25   SG

📌 Shuffling

from df_anonymizer import dataShuffling

df_shuffle = pd.DataFrame({'Name': ['A', 'B', 'C'], 'Age': [20, 30, 40]})
df_shuffle = dataShuffling(df_shuffle)
print(df_shuffle)

# Output:
#   Name  Age
# 0    B   30
# 1    A   20
# 2    C   40

📌 k-Anonymity Score

from df_anonymizer import calculateKAnonymity

df_kanon = pd.DataFrame({
    'Age': [25, 25, 30, 30],
    'Zip': ['12345', '12345', '67890', '67890']
})

k_score = calculateKAnonymity(df_kanon, ['Age', 'Zip'])
print(f"k-anonymity score: {k_score}")

# Output:
# k-anonymity score: 2

Reference

  1. Guide To Basic Anonymization

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

df_anonymizer-0.1.4.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

df_anonymizer-0.1.4-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file df_anonymizer-0.1.4.tar.gz.

File metadata

  • Download URL: df_anonymizer-0.1.4.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for df_anonymizer-0.1.4.tar.gz
Algorithm Hash digest
SHA256 500c1273423fb85865e36e8362eb6cf0027d8a73985c778c7629321b06283d38
MD5 f0720e6f64d1aec72834e6841c5ed988
BLAKE2b-256 7177193a5e67ab15351612fc074758d92b44a277be0110c6aec81e2d8f85f124

See more details on using hashes here.

File details

Details for the file df_anonymizer-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: df_anonymizer-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for df_anonymizer-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 079202c123f7b2db01807fda6d31c9cef48251f58686a09c86d40df7ba4d2810
MD5 b63b33c436973a815546cb50768ea4fc
BLAKE2b-256 77a29d237740f21cf07157d26fecd2849cdbd34c5a6741d0541e42211565f4c5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page