我在一周中的 3 天在 3 個地方發布了以下 3 個人的資料框:

我想將上述資料轉換為下表格式:

實際上,我正在用列名交換單元格值。
我想要一些關于如何使用 Python 以編程方式執行此操作的指標。
uj5u.com熱心網友回復:
這是可以作業的東西
- 通過查找當前的唯一值來獲取新的列名,即地點
dataframe - 通過新的列名(地方),舊列(人)作為新的資料幀使用每個新列新條目的添加名稱環
apply法
代碼:
import io
import pandas as pd
import numpy as np
txt="""
tom,dick
Mon,cafe,lib
Tue,lib,gym
Wed,gym,gym
"""
df = pd.read_csv(io.StringIO(txt))
print(df)
new_cols = np.unique(df.values)
new_df = pd.DataFrame(columns=new_cols)
for col in new_cols:
new_df[col] = df.apply(lambda x: df.columns[x == col].values, axis=1)
print(new_df)
輸出:
old df
tom dick
Mon cafe lib
Tue lib gym
Wed gym gym
new df
cafe gym lib
Mon [tom] [] [dick]
Tue [] [dick] [tom]
Wed [] [tom, dick] []
或者如果多個人從未在樣本地點,即您不想要值串列:
import io
import pandas as pd
import numpy as np
txt="""
tom,dick
Mon,cafe,lib
Tue,lib,gym
Wed,gym,cafe
"""
df = pd.read_csv(io.StringIO(txt))
print(df)
new_cols = np.unique(df.values)
new_df = pd.DataFrame(columns=new_cols)
def get_place(row, col):
place = df.columns[row == col].values
return place[0] if len(place) else ''
for col in new_cols:
new_df[col] = df.apply(lambda x:get_place(x, col), axis=1)
print(new_df)
輸出:
old df
tom dick
Mon cafe lib
Tue lib gym
Wed gym cafe
new df
cafe gym lib
Mon tom dick
Tue dick tom
Wed dick tom
uj5u.com熱心網友回復:
鑒于此資料框df:
Tom Dick Harry
Mon Cafe Library Gym
Tue Library Gym Cafe
Wed Gym Cafe Library
你可以得到你想要的結果
(i)unstack獲取 MultiIndex 系列的資料框
(ii) 重新排列本系列的指標水平和數值的順序
(iii) 將系列拆開
s = df.unstack()
s = pd.Series(s.index.get_level_values(0).to_numpy(), index = pd.MultiIndex.from_tuples(zip(s.index.get_level_values(1), s)))
out = s.unstack()
輸出:
Cafe Gym Library
Mon Tom Harry Dick
Tue Harry Dick Tom
Wed Dick Tom Harry
此示例是一個特殊情況,在步驟 (iii) 中運行良好,因為沒有重復索引,但是,在一般情況下,您更有可能擁有重復索引。
例如,您可以擁有以下資料框:
Tom Dick Harry
Mon Cafe Library Gym
Tue Library Gym Cafe
Wed Library Cafe Library
其中,在Wednesday雙方Tom并Harry去了library。在這種情況下,上述解決方案將不起作用,因為在步驟 (ii) 之后我們將有重復的索引。但是您可以通過在第 (ii) 步之后通過聚合索引來再添加兩行來解決該問題:
s = df.unstack()
s = pd.Series(s.index.get_level_values(0).to_numpy(), index = pd.MultiIndex.from_tuples(zip(s.index.get_level_values(1), s)))
s = s.groupby(s.index).agg(list)
s.index = pd.MultiIndex.from_tuples(s.index)
out = s.unstack()
輸出:
Cafe Gym Library
Mon [Tom] [Harry] [Dick]
Tue [Harry] [Dick] [Tom]
Wed [Dick] NaN [Tom, Harry]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389521.html
下一篇:在時間段內僅選取第一個值等于1
