我有這個資料集:
NAME VALUE1 VALUE2
0 Alpha 100 A1
1 Alpha 100 A1
2 Alpha 200 A2
我想要一個 for 回圈,它可以遍歷每個單獨的值并做出每個可能的解決方案,而無需重復,然后將每一對推入一個陣列,如下所示:
[
[ALPHA, 100]
[ALHA, 100]
[ALPHA, 200]
[ALPHA, A1]
[ALPHA, A1]
[ALPHA, A2]
[100, A1]
[100, A1]
[200, A2]
[ALPHA, 100, A1]
[ALPHA, 100, A1]
[ALPHA, 200, A2]
]
我目前有這個給我想要的結果,但如果我要使用更大的資料集,我認為必須有一種更簡單的方法來自動化這個程序。
A = []
for index, row in df.iterrows():
A.append([df.iloc[index,0], df.iloc[index,1]])
for index, row in df.iterrows():
A.append([df.iloc[index,0], df.iloc[index,2]])
for index, row in df.iterrows():
A.append([df.iloc[index,1], df.iloc[index,2]])
for index, row in df.iterrows():
A.append([df.iloc[index,0], df.iloc[index, 1], df.iloc[index,2]])
uj5u.com熱心網友回復:
如果不先轉換為熊貓,這會更容易,但這會做到:
import pandas as pd
import itertools
data = [
['Alpha', 100, 'A1'],
['Alpha', 100, 'A1'],
['Alpha', 200, 'A2']
]
df = pd.DataFrame(data, columns=['NAME','VALUE1','VALUE2'])
print(df)
# Extract the columns.
c1 = set(df['NAME'].tolist())
c2 = set(df['VALUE1'].tolist())
c3 = set(df['VALUE2'].tolist())
for z in itertools.product(c1,c2):
print(z)
for z in itertools.product(c1,c3):
print(z)
for z in itertools.product(c2,c3):
print(z)
for z in itertools.product(c1,c2,c3):
print(z)
輸出:
NAME VALUE1 VALUE2
0 Alpha 100 A1
1 Alpha 100 A1
2 Alpha 200 A2
('Alpha', 200)
('Alpha', 100)
('Alpha', 'A1')
('Alpha', 'A2')
(200, 'A1')
(200, 'A2')
(100, 'A1')
(100, 'A2')
('Alpha', 200, 'A1')
('Alpha', 200, 'A2')
('Alpha', 100, 'A1')
('Alpha', 100, 'A2')
itertools.product是相對較新的。itertools.permutations您實際上可以使用而不是三個不同的回圈來執行兩級回圈。
跟進
這是您如何將其概括為 3 列以上的方法。基本上,在一個回圈中,您一次執行 2 個,然后一次執行 3 個,依此類推, itertools.combinations可以回傳我們需要的所有組合。
import itertools
import pandas as pd
data = [
['Alpha', 100, 'A1', 999],
['Alpha', 100, 'A1', 888],
['Alpha', 200, 'A2', 777]
]
columns=['NAME','VALUE1','VALUE2','VALUE3']
df = pd.DataFrame(data, columns=columns)
print(df)
for r in range(2,len(columns) 1):
for cols in itertools.combinations( columns, r ):
cdata = [set(df[c].tolist()) for c in cols]
for z in itertools.product(*cdata):
print(z)
輸出:
NAME VALUE1 VALUE2 VALUE3
0 Alpha 100 A1 999
1 Alpha 100 A1 888
2 Alpha 200 A2 777
('Alpha', 200)
('Alpha', 100)
('Alpha', 'A1')
('Alpha', 'A2')
('Alpha', 888)
('Alpha', 777)
('Alpha', 999)
(200, 'A1')
(200, 'A2')
(100, 'A1')
(100, 'A2')
(200, 888)
(200, 777)
(200, 999)
(100, 888)
(100, 777)
(100, 999)
('A1', 888)
('A1', 777)
('A1', 999)
('A2', 888)
('A2', 777)
('A2', 999)
('Alpha', 200, 'A1')
('Alpha', 200, 'A2')
('Alpha', 100, 'A1')
('Alpha', 100, 'A2')
('Alpha', 200, 888)
('Alpha', 200, 777)
('Alpha', 200, 999)
('Alpha', 100, 888)
('Alpha', 100, 777)
('Alpha', 100, 999)
('Alpha', 'A1', 888)
('Alpha', 'A1', 777)
('Alpha', 'A1', 999)
('Alpha', 'A2', 888)
('Alpha', 'A2', 777)
('Alpha', 'A2', 999)
(200, 'A1', 888)
(200, 'A1', 777)
(200, 'A1', 999)
(200, 'A2', 888)
(200, 'A2', 777)
(200, 'A2', 999)
(100, 'A1', 888)
(100, 'A1', 777)
(100, 'A1', 999)
(100, 'A2', 888)
(100, 'A2', 777)
(100, 'A2', 999)
('Alpha', 200, 'A1', 888)
('Alpha', 200, 'A1', 777)
('Alpha', 200, 'A1', 999)
('Alpha', 200, 'A2', 888)
('Alpha', 200, 'A2', 777)
('Alpha', 200, 'A2', 999)
('Alpha', 100, 'A1', 888)
('Alpha', 100, 'A1', 777)
('Alpha', 100, 'A1', 999)
('Alpha', 100, 'A2', 888)
('Alpha', 100, 'A2', 777)
('Alpha', 100, 'A2', 999)
跟進#2
這會為每個列組合創建“子資料框”。我將把它作為練習留給讀者將它們轉換為行串列。
import itertools
import pandas as pd
data = [
['Alpha', 100, 'A1',999],
['Alpha', 100, 'A1',888],
['Alpha', 200, 'A2',777]
]
columns=['NAME','VALUE1','VALUE2','VALUE3']
df = pd.DataFrame(data, columns=columns)
print(df)
for r in range(2,len(columns) 1):
for cols in itertools.combinations( columns, r ):
print(df[list(cols)])
輸出:
NAME VALUE1 VALUE2 VALUE3
0 Alpha 100 A1 999
1 Alpha 100 A1 888
2 Alpha 200 A2 777
NAME VALUE1
0 Alpha 100
1 Alpha 100
2 Alpha 200
NAME VALUE2
0 Alpha A1
1 Alpha A1
2 Alpha A2
NAME VALUE3
0 Alpha 999
1 Alpha 888
2 Alpha 777
VALUE1 VALUE2
0 100 A1
1 100 A1
2 200 A2
VALUE1 VALUE3
0 100 999
1 100 888
2 200 777
VALUE2 VALUE3
0 A1 999
1 A1 888
2 A2 777
NAME VALUE1 VALUE2
0 Alpha 100 A1
1 Alpha 100 A1
2 Alpha 200 A2
NAME VALUE1 VALUE3
0 Alpha 100 999
1 Alpha 100 888
2 Alpha 200 777
NAME VALUE2 VALUE3
0 Alpha A1 999
1 Alpha A1 888
2 Alpha A2 777
VALUE1 VALUE2 VALUE3
0 100 A1 999
1 100 A1 888
2 200 A2 777
NAME VALUE1 VALUE2 VALUE3
0 Alpha 100 A1 999
1 Alpha 100 A1 888
2 Alpha 200 A2 777
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/491713.html
