输入数据:
data = [
['0039384', [{'A': 415}, {'A': 228}, {'B': 360}, {'B': 198}, {'C': 300}, {'C': 165}]],
['0035584', [{'A': 345}, {'A': 117}, {'B': 223}, {'B': 554}, {'C': 443}, {'C': 143}]]
]
df = pd.DataFrame(data=data, columns=['id', 'prices'])
我想要得到这个结果:
id CurrentPrice_A LastPrice_C CurrentPrice_B LastPrice_B CurrentPrice_C LastPrice_C
0039384 415 228 360 198 300 165
我已经尝试分开字典,然后每一列替换和重命名,然后获得价格,但它需要大约10行代码。你知道什么快捷的方法吗?
可以方便地遍历数据框的每一行,这样就可以控制算法,将字典两个两个地压缩(以便合并当前的和最后的),并动态地分配列名及其值。
为方便起见,您可以使用列表和临时字典,而不是使用pd.concat()。
import pandas as pd
data = [
['0039384', [{'A': 415}, {'A': 228}, {'B': 360}, {'B': 198}, {'C': 300}, {'C': 165}]],
['0035584', [{'A': 345}, {'A': 117}, {'B': 223}, {'B': 554}, {'C': 443}, {'C': 143}]]
]
df = pd.DataFrame(data=data, columns=['id', 'prices'])
new_df_rows = []
for index, row in df.iterrows():
grouped_prices = zip(row.prices[::2], row.prices[1::2]) # create groups two-by-two
tmp_dict = {'id': row.id}
for curr_price, last_price in grouped_prices:
tmp_dict.update({
'CurrentPrice_' + str(list(curr_price.keys())[0]): int(list(curr_price.values())[0]),
'LastPrice_' + str(list(last_price.keys())[0]): int(list(last_price.values())[0])
})
new_df_rows.append(tmp_dict)
new_df = pd.DataFrame(new_df_rows)
print(new_df)
输出将是:
id CurrentPrice_A LastPrice_A CurrentPrice_B LastPrice_B CurrentPrice_C LastPrice_C
0 0039384 415 228 360 198 300 165
1 0035584 345 117 223 554 443 143
首先将列表行转换为新列:
dfx = pd.DataFrame(df['prices'].tolist(),index=df.id)
print(dfx)
'''
0 1 2 3 4 5
id
0039384 {'A': 415} {'A': 228} {'B': 360} {'B': 198} {'C': 300} {'C': 165}
0035584 {'A': 345} {'A': 117} {'B': 223} {'B': 554} {'C': 443} {'C': 143}
'''
然后我们把这些列分成奇数和偶数。奇数表示最后的价格,偶数表示当前的价格:
last=list(filter(lambda x: x % 2, list(dfx.columns))) #[1, 3, 5]
currents=list(sorted(set(dfx.columns) - set(last))) #[0, 2, 4]
现在,重命名列:
for i in currents:
dfx=dfx.rename(columns={i:'CurrentPrice_{}'.format(list(dfx[i].iloc[0].keys())[0])})
for i in last:
dfx=dfx.rename(columns={i:'LastPrice_{}'.format(list(dfx[i].iloc[0].keys())[0])})
print(dfx)
'''
id CurrentPrice_A LastPrice_A CurrentPrice_B LastPrice_B CurrentPrice_C LastPrice_C
0039384 {'A': 415} {'A': 228} {'B': 360} {'B': 198} {'C': 300} {'C': 165}
0035584 {'A': 345} {'A': 117} {'B': 223} {'B': 554} {'C': 443} {'C': 143}
'''
最后,从字典中获取值:
for i in dfx.columns:
dfx[i]=dfx[i].apply(lambda x: list(x.values())[0])
print(dfx)
'''
id CurrentPrice_A LastPrice_A CurrentPrice_B LastPrice_B CurrentPrice_C LastPrice_C
0039384 415 228 360 198 300 165
0035584 345 117 223 554 443 143
'''