我想讓這段代碼更加優雅和精簡。我有三個需要組合使用 Seaborn 色調的資料框。我需要為色調本身添加一個鍵。
這是我想出來的,但我覺得必須有一個更優雅和高效的方式
df = pd.DataFrame({ 'A' : range(3), 'B' : range(3) })
frames = (df.copy(), df.copy(), df.copy())
f_names = ["one", "two", "three"]
dff = pd.DataFrame()
for e, f in enumerate(frames):
tmp = f.copy()
tmp['name'] = f_names[e]
dff = dff.append(tmp, ignore_index=True)
print(dff)
Output:
A B name
0 0 0 one
1 1 1 one
2 2 2 one
3 0 0 two
4 1 1 two
5 2 2 two
6 0 0 three
7 1 1 three
8 2 2 three
謝謝!
uj5u.com熱心網友回復:
IIUC,您想重復 n 次df并添加 n 個標簽(此處 n=3)。
你有幾個選擇。
連接 np.repeat
將輸入連接 n 次,并將重復的標簽添加為新列。
f_names = ["one", "two", "three"]
dff = pd.concat([df]*len(f_names), ignore_index=True)
dff['C'] = np.repeat(f_names, len(f_names))
如果您有不同的資料框,此選項也適用:
dfs = [df1, df2, df3]
f_names = ["one", "two", "three"]
dff = pd.concat(dfs, ignore_index=True)
dff['C'] = np.repeat(f_names, list(map(len, dfs)))
或使用字典作為輸入:
dff = (pd.concat({'one': df1, 'two': df2, 'three': df3}, names='C')
.reset_index(level=0)
)
交叉合并
merge您可以使用精心制作的系列進行交叉。
s = pd.Series(['one', 'two', 'three'], name='C')
dff = df.merge(s, how='cross')
輸出:
A B C
0 0 0 one
1 0 0 two
2 0 0 three
3 1 1 one
4 1 1 two
5 1 1 three
6 2 2 one
7 2 2 two
8 2 2 three
如果真的,行的順序很重要,您可以將此替代方案與pandas.merge(系列優先)一起使用:
s = pd.Series(['one', 'two', 'three'], name='C')
dff = pd.merge(s, df, how='cross')[list(df.columns) [s.name]]
輸出:
A B C
0 0 0 one
1 1 1 one
2 2 2 one
3 0 0 two
4 1 1 two
5 2 2 two
6 0 0 three
7 1 1 three
8 2 2 three
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412608.html
標籤:
下一篇:分布圖
