python - 仅在唯一值上循环 pandas 数据框

标签 python pandas

我有以下 pandas 数据框:

DB      Table   Column  Format

Retail  Orders  ID      INTEGER
Retail  Orders  Place   STRING
Dept    Sales   ID      INTEGER
Dept    Sales   Name    STRING

我想在表上循环,同时生成用于创建表的 SQL。例如

create table Retail.Orders ( ID INTEGER, Place STRING)
create table Dept.Sales ( ID INTEGER, Name STRING)

我已经做的是使用drop_duplicate获取不同的数据库和表,然后为每个表应用一个过滤器并连接字符串以创建一个sql。

def generate_tables(df_cols):
    tables = df_cols.drop_duplicates(subset=[KEY_DB, KEY_TABLE])[[KEY_DB, KEY_TABLE]]

    for index, row in tables.iterrows():
        db = row[KEY_DB]
        table = row[KEY_TABLE]

        print("DB: " + db)
        print("Table: " + table)

        sql = "CREATE TABLE " + db + "." + table + " ("
        cols = df_cols.loc[(df_cols[KEY_DB] == db) & (df_cols[KEY_TABLE] == table)]
        for index, col in cols.iterrows():
            sql += col[KEY_COLUMN] + " " + col[KEY_FORMAT] + ", "

        sql += ")"

        print(sql)

是否有更好的方法来迭代数据帧?

最佳答案

我就是这样做的。首先通过 df.itertuples 创建一个字典 [比 df.iterrows 更高效],然后使用 str.format 无缝包含值。

通过使用set来保证字典构造的唯一性。

我还转换为生成器,以便您可以根据需要有效地迭代它;总是可以通过 list 耗尽生成器,如下所示。

from collections import defaultdict

d = defaultdict(set)
for row in df.itertuples():
    d[(row[1], row[2])].add((row[3], row[4]))

def generate_tables_jp(d):
    for k, v in d.items():
        yield 'CREATE TABLE {0}.{1} ({2})'\
              .format(k[0], k[1], ', '.join([' '.join(i) for i in v]))

list(generate_tables_jp(d))

结果:

['CREATE TABLE Retail.Orders (ID INTEGER, Place STRING)',
 'CREATE TABLE Dept.Sales (ID INTEGER, Name STRING)']

关于python - 仅在唯一值上循环 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49424084/

相关文章:

python - 将前 N 行与 pandas 列中的当前行进行比较

python - 哈希函数不会为相同的输入返回相同的输出

python - 如何修复 pip 安装程序安装的软件包的 "__path__ attribute not found"错误?

python - 为 Pandas 提供 python iterable 与 pd.Series for column 的区别

python - 计算 dask 数据帧中所有行差异的有效方法

python - 删除*几乎*重复的观察 - Python

python - 为什么 PyQt connect() 语法如此冗长?

python - 如何将网格中的所有字母向左移动?

python - Pandas DataFrame 的多个列表

python - Pandas 与 R 中相同的正则表达式但结果不同