我有2個資料框如下:
dfa = pd.DataFrame(['AA', 'BB', 'CC'], columns=list('A'))
dfb = pd.DataFrame(['AC', 'BC', 'CC'], columns=list('B'))
我的輸出是生成一個新的資料框,其中包含 dfb 中的 B 列和從 B 到 A 的每個元素之間的另一列距離(例如,從 AC 到 AA 的漢明距離為 1),如下所示:
B disB disB disB
0 AC 1 2 1
1 BC 2 1 1
2 CC 2 2 0
我嘗試過的代碼是這樣的(由其他帖子提供):
dfa = pd.DataFrame(['AA', 'BB', 'CC'], columns=list('A'))
dfb = pd.DataFrame(['AC', 'BC', 'CC'], columns=list('B'))
df_summary = dfb.copy()
for seq1 in dfa.A:
df__ = []
for seq2 in dfb.B:
hd = sum(c1 != c2 for c1, c2 in zip(seq1, seq2))
df__.append(hd)
df_summary['dis_{}'.format(column)] = pd.DataFrame({'dis_' column: df__}).values
print(df_summary)
結果會給我3個輸出:
B dis_B
0 AC 1
1 BC 2
2 CC 2
B dis_B
0 AC 2
1 BC 1
2 CC 2
B dis_B
0 AC 1
1 BC 1
2 CC 0
但我需要將它們組合成一個,例如:
B disB disB disB
0 AC 1 2 1
1 BC 2 1 1
2 CC 2 2 0
謝謝你的幫助!
uj5u.com熱心網友回復:
矢量化(閱讀“更快”)解決方案:
a = np.array(dfa['A'].str.split('').str[1:-1].tolist())
b = np.array(dfb['B'].str.split('').str[1:-1].tolist())
dfb[['disB_1', 'disB_2', 'disB_3']] = (a != b[:, None]).sum(axis=2)
輸出:
>>> dfb
B disB_1 disB_2 disB_3
0 AC 1 2 1
1 BC 2 1 1
2 CC 2 2 0
uj5u.com熱心網友回復:
這是一個答案,它給出的結果與問題框架的形式略有不同,但使用“A”和“B”的值作為資料框結果的index和columns,這可能更能描述最終結果:
import pandas as pd
lists = {'A' : ['AA', 'BB', 'CC'], 'B' : ['AC', 'BC', 'CC']}
df = pd.DataFrame(data=[[sum(c != d for c, d in zip(lists['B'][i], lists['A'][j])) for j in range(len(lists['A']))] for i in range(len(lists['B']))], index=lists['B'], columns=lists['A'])
print(df)
輸出:
AA BB CC
AC 1 2 1
BC 2 1 1
CC 2 2 0
這是上述創建通用矩陣的方法與numpy使用硬編碼列名的另一個答案中所示的解決方案之間的性能比較:
import pandas as pd
import numpy as np
lists = {'A' : ['AA', 'BB', 'CC'], 'B' : ['AC', 'BC', 'CC']}
df = pd.DataFrame(data=[[sum(c != d for c, d in zip(lists['B'][i], lists['A'][j])) for j in range(len(lists['A']))] for i in range(len(lists['B']))], index=lists['B'], columns=lists['A'])
print(df)
dfa = pd.DataFrame(['AA', 'BB', 'CC'], columns=list('A'))
dfb = pd.DataFrame(['AC', 'BC', 'CC'], columns=list('B'))
def foo(dfa, dfb):
df = pd.DataFrame(data=[[sum(c != d for c, d in zip(dfb['B'][i], dfa['A'][j])) for j in range(len(dfa['A']))] for i in range(len(dfb['B']))], index=dfb['B'], columns=dfa['A'])
return df
def bar(dfa, dfb):
a = np.array(dfa['A'].str.split('').str[1:-1].tolist())
b = np.array(dfb['B'].str.split('').str[1:-1].tolist())
dfb[['disB_1', 'disB_2', 'disB_3']] = (a != b[:, None]).sum(axis=2)
return dfb
import timeit
print("\nGeneral matrix approach:")
t = timeit.timeit(lambda: foo(dfa, dfb), number = 100)
print(f"timeit: {t}")
print("\nHarcoded columns approach:")
t = timeit.timeit(lambda: bar(dfa, dfb), number = 100)
print(f"timeit: {t}")
輸出和性能通過timeit:
AA BB CC
AC 1 2 1
BC 2 1 1
CC 2 2 0
General matrix approach:
timeit: 0.023536499997135252
Harcoded columns approach:
timeit: 0.03922149998834357
這似乎表明該numpy方法所需的時間大約是此答案中的一般矩陣方法的 1.5-2 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443588.html
上一篇:無法提取第一列Pandas系列
