我定義了一個字典,其中該對中的值實際上是資料幀。
# Creating a dictionary
data = {'Value':[0,0,0]}
kernel_df = pd.DataFrame(data, index=['M1','M2','M3'])
dict = {'dummy':kernel_df}
# dummy -> Value
# M1 0
# M2 0
# M3 0
然后,使用以下代碼,我嘗試批量處理一個大型資料幀并將一些列附加在一起。
df = pd.read_csv('test.batch.csv')
for i in range(0, len(df), 3):
print("\n------BATCH BEGIN")
batch_df = df.iloc[i:i 3]
name = batch_df.loc[i].at["Name"]
values = batch_df.loc[:,["Value"]]
print(name)
print(values)
print("------BATCH END")
if name in dict:
# Append values to the existing key
dict[name] = pd.concat( [dict[name],values], axis=1 ) # <-- Is not correct
else:
# Create a new pair in dictionary
dict[name] = values;
根據輸出,一切正常,但如您所見,連接看起來不正確。事實上,我想將“值”列水平附加到現有的列。
ID Name Metric Value
0 0 K1 M1 10
1 0 K1 M2 5
2 0 K1 M3 10
3 1 K2 M1 20
4 1 K2 M2 10
5 1 K2 M3 15
6 2 K1 M1 2
7 2 K1 M2 2
8 2 K1 M3 2
------BATCH BEGIN
K1
Value
0 10
1 5
2 10
------BATCH END
------BATCH BEGIN
K2
Value
3 20
4 10
5 15
------BATCH END
------BATCH BEGIN
K1
Value
6 2
7 2
8 2
------BATCH END
{'dummy': Value
M1 0
M2 0
M3 0, 'K1': Value Value
0 10.0 NaN
1 5.0 NaN
2 10.0 NaN
6 NaN 2.0
7 NaN 2.0
8 NaN 2.0, 'K2': Value
3 20
4 10
5 15}
我該如何解決?
更新:我希望看到以下字典
{'dummy': Value
M1 0
M2 0
M3 0, 'K1': Value Value
0 10.0 2.0
1 5.0 2.0
2 10.0 2.0, 'K2': Value
3 20
4 10
5 15}
這顯示在頁面中。
uj5u.com熱心網友回復:
有幾種方法。也許最安全的方法是將每個子組按以下方式分組:groupby NameID
for name, df_group in df.groupby('Name'):
d[name] = pd.concat(
[g.reset_index(drop=True) for _, g in df_group.groupby('ID')['Value']],
axis=1
)
注意我們reset_index在每個子組上,以便索引正確對齊。
這種方法是最安全的,因為我們是按分組ID而不是在沒有檢查的情況下每 3 行抓取一次。
我們還可以創建一個RangeIndex和地板除以 3,以便我們將每三行組合在一起而不考慮ID列:
for name, df_group in df.groupby('Name'):
df_group.index = pd.RangeIndex(len(df_group)) // 3
d[name] = pd.concat([
g.reset_index(drop=True)
for _, g in df_group.groupby(level=0)['Value']
], axis=1)
reset_index每個子組的相同情況在這里發生以允許行對齊。這在一定程度上是安全的,并且不會在df_group不能均勻分成 3 行塊的情況下失敗。
最不健壯的方法,但如果要求成立,可能是最快的方法,是使用to_numpy和reshape:
for name, df_group in df.groupby('Name'):
a = df_group['Value'].to_numpy().reshape((3, -1))
d[name] = pd.DataFrame(a, columns=['Value'] * a.shape[1])
如果陣列不能重整為長度為 3 的偶數列,這將失敗,但是,這是最快的,因為它不需要任何重新分組或重新索引。columns=['Value'] * a.shape[1]是可選的,但是,顯示的輸出顯示了多Value列,因此這使得Value標簽的長度與 中的列數相同a。
所有選項產生d:
{'dummy': Value
M1 0
M2 0
M3 0, 'K1': Value Value
0 10 5
1 10 2
2 2 2, 'K2': Value
0 20
1 10
2 15}
設定和匯入:
import pandas as pd
df = pd.DataFrame({
'ID': [0, 0, 0, 1, 1, 1, 2, 2, 2],
'Name': ['K1', 'K1', 'K1', 'K2', 'K2', 'K2', 'K1', 'K1', 'K1'],
'Metric': ['M1', 'M2', 'M3', 'M1', 'M2', 'M3', 'M1', 'M2', 'M3'],
'Value': [10, 5, 10, 20, 10, 15, 2, 2, 2]
})
data = {'Value': [0, 0, 0]}
kernel_df = pd.DataFrame(data, index=['M1', 'M2', 'M3'])
d = {'dummy': kernel_df}
一般python注釋dict是內置的,因此應避免將其作為變數名。為此,d在上面的代碼中已更新為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351733.html
