使用Itertools列出列名



我有这个Dataframe:

STATE CITY      TAX_C   MATERIAL    IG  LIMIT
0   TX    DALLAS    1       CARP        0   5
1   TX    DALLAS    1       BLAY        0   10

我使用itertools创建了一个循环,它从每行中获取每列的组合:

res = []
for r in range(2,len(df.columns)+1):
for cols in itertools.combinations(df.columns, r ):
res += df[list(cols)].T.to_dict('list').values()
res

它给了我这样的输出:

[[TX, DALLAS], [TX, DALLAS], [DALLAS, 1], [DALLAS 1], [1, CARP], [1, BLAY], [CARP, 0], [0,5], [TX, 1],...]

我试图得到一个输出,打印出列名之前的每个值,像这样:

[[STATE: 'TX', CITY: 'DALLAS'], [STATE: 'TX', CITY: 'DALLAS'], [CITY: 'DALLAS', TAX_C: '1'], [CITY: 'DALLAS', TAX_C: '1'], [TAX_C: '1', MATERIAL: 'CARP']...]

所以我像这样复制了你的数据

data = [["TX", "TX"], ["DALLAS", "DALLAS"], [1, 1], ["CARP", "BLAY"], [0,0], [5,15]]
df = pd.DataFrame(data).T
df.columns=["STATE", "CITY", "TAX_C", "MATERIAL", "IG", "LIMIT"]

我认为第一步是深入了解如何从数据框中获取dictionary

for key, value in df.to_dict(orient="index").items():
print(value)

收益率

{'STATE': 'TX', 'CITY': 'DALLAS', 'TAX_C': 1, 'MATERIAL': 'CARP', 'IG': 0, 'LIMIT': 5}
{'STATE': 'TX', 'CITY': 'DALLAS', 'TAX_C': 1, 'MATERIAL': 'BLAY', 'IG': 0, 'LIMIT': 15}

如果我们再深入一点你可以在它上面循环并添加一个列表,像这样

results = []
for key, value in df.to_dict(orient="index").items():
row = list(value.items())
for nr in range((len(value)-1)):
results.append([list(row[nr]), list(row[nr+1])])

收益率

[[['STATE', 'TX'], ['CITY', 'DALLAS']],
[['CITY', 'DALLAS'], ['TAX_C', 1]],
[['TAX_C', 1], ['MATERIAL', 'CARP']],
[['MATERIAL', 'CARP'], ['IG', 0]],
[['IG', 0], ['LIMIT', 5]],
[['STATE', 'TX'], ['CITY', 'DALLAS']],
[['CITY', 'DALLAS'], ['TAX_C', 1]],
[['TAX_C', 1], ['MATERIAL', 'BLAY']],
[['MATERIAL', 'BLAY'], ['IG', 0]],
[['IG', 0], ['LIMIT', 15]]]

请注意,你的描述在Python中是不可能的。比如列表或字典。列表之间只能用逗号分隔。

我希望这对你有帮助:)

尝试以下代码:

res = []
for r in range(2, df.columns.size + 1):
for cols in itertools.combinations(df.columns, r):
res += df[list(cols)].T.to_dict().values()
res
不同之处在于我去掉了to_dict的参数,所以它使用默认方向dict

。结果的初始部分是:

[{'STATE': 'TX', 'CITY': 'DALLAS'},
{'STATE': 'TX', 'CITY': 'DALLAS'},
{'STATE': 'TX', 'TAX_C': 1},
{'STATE': 'TX', 'TAX_C': 1},
{'STATE': 'TX', 'MATERIAL': 'CARP'},
{'STATE': 'TX', 'MATERIAL': 'BLAY'},
{'STATE': 'TX', 'IG': 0},
{'STATE': 'TX', 'IG': 0},
{'STATE': 'TX', 'LIMIT': 5},
{'STATE': 'TX', 'LIMIT': 10},

所以它是一个字典列表,非常类似于你想要的结果。

我认为您正在寻找pairwise而不是itertools中的combinations-

pairs = []
for col_pair in pairwise(df.columns):
values = df[list(col_pair)].to_records(index=False)
keys = col_pair
pairs.extend(dict(zip(col_pair, _)) for _ in values)

[{'STATE': 'TX', 'CITY': 'DALLAS'},
{'STATE': 'TX', 'CITY': 'DALLAS'},
{'CITY': 'DALLAS', 'TAX_C': 1},
{'CITY': 'DALLAS', 'TAX_C': 1},
{'TAX_C': 1, 'MATERIAL': 'CARP'},
{'TAX_C': 1, 'MATERIAL': 'BLAY'},
{'MATERIAL': 'CARP', 'IG': 0},
{'MATERIAL': 'BLAY', 'IG': 0},
{'IG': 0, 'LIMIT': 5},
{'IG': 0, 'LIMIT': 10}]

最新更新