Observed since 20 Oct, 18:36 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A declarative Python library built on top of pandas with human-readable function names
A declarative Python library built on top of pandas that uses human-readable function names to perform data operations. Inspired by ActiveQuery patterns in PHP, Easy Pandas makes data manipulation more intuitive and expressive.
pip install ActivePandasQuery
Or install from source:
git clone https://github.com/talamann/ActivePandasQuery.git
cd ActivePandasQuery
pip install -e .
from active_pandas_query import EasyDataFrame
import pandas as pd
# Create an EasyDataFrame from a regular pandas DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 30, 35, 28, 32],
'city': ['New York', 'London', 'Paris', 'Tokyo', 'Berlin'],
'salary': [50000, 60000, 75000, 55000, 70000]
}
df = EasyDataFrame(data)
# Use human-readable function names!
result = df.filter_age_greaterthan_30()
print(result)
Write data operations using natural, human-readable function names:
# Filter data
df.filter_age_greaterthan_25()
df.filter_city_equals_london()
df.filter_name_contains_alice()
# Sort data
df.sort_by_age()
df.sort_by_salary_desc()
df.sort_by_age_asc_and_salary_desc()
# Aggregate data
df.aggregate_salary_sum()
df.groupby_city_and_aggregate_salary_mean()
# Select columns
df.select_name_and_age()
# Chain operations
df.filter_age_greaterthan_25().sort_by_salary_desc().select_name_and_salary()
Chain multiple operations together for complex queries:
result = (df
.filter_age_greaterthan_25_and_city_equals_newyork()
.sort_by_salary_desc()
.select_name_and_age_and_salary()
)
Easy Pandas wraps pandas DataFrames, so you can:
df.to_pandas()df.dfFilter data using comparison and string operators:
# Comparison operators
df.filter_age_equals_30()
df.filter_age_greaterthan_25()
df.filter_age_lessthan_40()
df.filter_age_greaterthanorequal_30()
df.filter_salary_between_50000_and_70000()
# String operators
df.filter_name_contains_alice()
df.filter_city_startswith_new()
df.filter_email_endswith_com()
# Null checks
df.filter_age_notna()
df.filter_city_isna()
# Multiple conditions
df.filter_age_greaterthan_25_and_city_equals_london()
df.filter_age_lessthan_30_or_salary_greaterthan_60000()
Supported operators:
equals, eq → ==notequals, ne → !=greaterthan, gt → >lessthan, lt → <greaterthanorequal, gte → >=lessthanorequal, lte → <=contains → String containsstartswith → String starts withendswith → String ends withisin → Value in listnotin → Value not in listbetween → Value between rangeisna, isnull → Is null/NAnotna, notnull → Not null/NASort by one or multiple columns:
# Single column
df.sort_by_age()
df.sort_by_salary_desc()
# Multiple columns
df.sort_by_age_asc_and_salary_desc()
df.sort_by_city_and_name()
Perform aggregations and group operations:
# Simple aggregations
df.aggregate_salary_sum()
df.aggregate_age_mean()
df.aggregate_salary_max()
# Group by operations
df.groupby_city_and_aggregate_salary_mean()
df.groupby_city_and_aggregate_age_count()
Supported aggregation functions:
sum → Sum of valuesmean, avg, average → Mean/averagecount → Count of valuesmin → Minimum valuemax → Maximum valuestd → Standard deviationvar → Variancemedian → Median valuenunique → Number of unique valuesfirst → First valuelast → Last valueSelect specific columns:
df.select_name_and_age()
df.select_name_and_city_and_salary()
Rename or drop columns:
# Rename columns
df.rename_old_name_to_new_name()
# Drop columns
df.drop_column1_and_column2()
Join with other DataFrames:
other_df = EasyDataFrame({'city': ['London', 'Paris'], 'country': ['UK', 'France']})
# Join operations
df.join_other_on_city(other=other_df)
df.leftjoin_other_on_city(other=other_df)
df.rightjoin_other_on_city(other=other_df)
df.outerjoin_other_on_city(other=other_df)
Append DataFrames:
df2 = EasyDataFrame({'name': ['Frank'], 'age': [40]})
df.appendto_other(other=df2)
# Find high earners in specific cities
result = (df
.filter_salary_greaterthan_60000_and_city_isin_london_paris()
.groupby_city_and_aggregate_salary_mean()
)
# Complete data transformation pipeline
result = (df
.filter_age_greaterthan_25()
.filter_salary_notna()
.sort_by_salary_desc()
.select_name_and_age_and_salary()
.reset_index()
)
# Filter by string patterns
tech_companies = (df
.filter_company_contains_tech()
.filter_email_endswith_com()
.sort_by_name()
)
df.filter_age_greaterthan_30_and_city_equals_london().sort_by_salary_desc()
df[(df['age'] > 30) & (df['city'] == 'london')].sort_values('salary', ascending=False)
The main class that wraps pandas DataFrame.
Constructor:
EasyDataFrame(data=None, **kwargs)
Methods:
to_pandas() → Convert to pandas DataFrameProperties:
df → Access underlying pandas DataFramecolumns → DataFrame columnsindex → DataFrame indexshape → DataFrame shapedtypes → Column data typesvalues → DataFrame valuesFunction names follow this pattern:
<operation>_<column>_<operator>_<value>_<connector>_...
Components:
filter, sort, groupby, aggregate, select, join, etc.and, or, by, to, on, etc.Examples:
filter_age_greaterthan_30sort_by_name_descgroupby_city_and_aggregate_salary_meanselect_name_and_age_and_emailContributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE file for details.
Inspired by ActiveQuery patterns in PHP frameworks like Yii and Laravel.
Built with ❤️ using pandas.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 1 Feb 2026 | 4 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 18:36 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:7dd8d62a272bba9c918e4bdc0b9e53356e524ba94eb4cd27a58988cb1c8f644d