我有一个看起来像这样的元素列表(为了清楚写成表格)
ID | OtherID
-------------
1 1
1 2
1 3
2 1
2 3
我想要转换为这样的表格,其中ID 1
和ID 2
是上表中ID
的值:
OtherID | ID 1 | ID 2
---------------------
1 True True
2 True False
3 True True
最好的方法是什么? ID
和OtherID
都来自数据库。如果它在数据库中做得更好,我很高兴任何建议。
更新 在评论中给出的@ 7yl4r的帮助下,我使用pandas实现了第一个版本:
import pandas as pd
data = [[1, 1],
[1, 2],
[2, 1],
[2, 3],
[3, 1],
[3, 4]]
df = pd.DataFrame(data, columns=['ID', 'OtherId'])
table = df.pivot(index='OtherId', columns='ID', values='ID').fillna(0)
table[table > 0] = 1
table.replace({1: True, 0: False}, inplace=True)
print(table)
有没有使用熊猫的简单方法?
答案 0 :(得分:1)
您可以使用此代码并调整/优化它以使用您的数据库
# input table format [(ID, OtherID), ...]
input_table = [
{'ID': 1, 'OtherID': 1},
{'ID': 1, 'OtherID': 2},
{'ID': 1, 'OtherID': 3},
{'ID': 2, 'OtherID': 1},
{'ID': 2, 'OtherID': 3}
]
# get distinct list of ID
id_set = set([rec['ID'] for rec in input_table])
# get distinct list of OtherID
other_id_set = set([rec['OtherID'] for rec in input_table])
# create empty output_table
output_table = list()
# iterate over distinct other_id
for other_id in other_id_set:
# create row with 'OtherID' column
row = {'OtherID': other_id}
# iterate over distinct id
for id in id_set:
# record { 'ID': id, 'OtherID': other_id } exists ?
exists = False
for rec in input_table:
if rec['ID'] == id and rec['OtherID'] == other_id:
exists = True
break
# add current ID column
row['ID ' + str(id)] = exists
# add row in output_table
output_table.append(row)
# print result
print(output_table)