我有以下 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/