![](/img/trans.png)
[英]Pandas: Convert DataFrame Column Values Into New Dataframe Indices and Columns
[英]Pandas DataFrame - Convert columns into JSON and add as a new column
考慮使用我從11k行大小的 MySQL 表中獲得的 DataFrame:
col1 | col2 | col3 | col4
-----------------------------
cat | black | small | lovely
-----------------------------
dog | white | medium| brave
-----------------------------
mice | grey | tinny | fast
...
我想將其動態轉換為以下內容:
col1 | newcol
------------------------------------------------------------
cat | {"col2": "black", "col3": "small", "col4": "lovely"}
------------------------------------------------------------
dog | {"col2": "white", "col3": "medium", "col4": "brave"}
------------------------------------------------------------
mice | {"col2": "grey", "col3": "tinny", "col4": "fast"}
...
您可以在axis=1
上將agg
作為dict
對於字典:
out = df[['col1']].assign(new_col=df.iloc[:,1:].agg(dict,1))
對於 json:
out = df[['col1']].assign(new_col=df.iloc[:,1:].agg(pd.Series.to_json,1))
print(out)
col1 new_col
0 cat {'col2': 'black', 'col3': 'small', 'col4': 'lo...
1 dog {'col2': 'white', 'col3': 'medium', 'col4': 'b...
2 mice {'col2': 'grey', 'col3': 'tinny', 'col4': 'fast'}
正如您所料,有很多方法可以做到這一點,但這是我想到的:
>>> import pandas as pd
>>> d = {"col1": ["cat", 'dog', 'mice'], "col2": ["black", "white", "grey"], "col3": ["small", 'medium', 'tinny'], 'col4': ['lovely', 'brave','fast']}
>>> df = pd.DataFrame(d)
>>> pd.concat([df[['col1']], pd.DataFrame({"newcol": df[['col2','col3','col4']].to_dict(orient='records')})], axis=1)
對於您可能不知道 DataFrame 中的列名的情況,您可以使用以下 select 列索引。 在這種情況下,從第 1 列開始,直到結束。
>>> pd.concat([df[['col1']], pd.DataFrame({"newcol": df.iloc[:, 1:].to_dict(orient='records')})], axis=1)
使用df.to_json(orient='records')
轉儲 json 記錄列表,然后將 json 加載到字典列表,分配給新列。
import pandas as pd
df = pd.DataFrame({'col1': ['cat', 'dog', 'mice'],
'col2' : ['black', 'white', 'grey'],
'col3' : ['small', 'medium', 'tinny']})
# create json column
# data_json = df.iloc[:, 1:].to_json(orient='records')
# data = json.loads(data_json)
data = df.iloc[:, 1:].to_dict(orient='records')
# keep first column
dfn = df.iloc[:, [0]].copy()
dfn['newcol'] = data
# dfn['newcol'] = pd.Series(data).map(json.dumps)
dfn
col1 newcol
0 cat {"col2": "black", "col3": "small"}
1 dog {"col2": "white", "col3": "medium"}
2 mice {"col2": "grey", "col3": "tinny"}
data_json
(類型str
)
[{"col2":"black","col3":"small"},{"col2":"white","col3":"medium"},{"col2":"grey","col3":"tinny"}]
除了 Anky 的回答,我發現這篇文章描述了更多的操作: https://codeflex.co/mysql-table-migration-with-pandas-dataframe/
我在下面的示例中使用了三列。
data = {'col1': ['cat', 'dog', 'mice'], 'col2' : ['black', 'white', 'grey'], 'col3' : ['small', 'medium', 'tinny']}
import pandas as pd
df = pd.DataFrame(data)
col = list(df.columns)
我們可以使用 lambda function 如下
df.apply(lambda x: {col[1]:x[1], col[2]:x[2]}, axis =1)
您可以將其添加到 dataframe 如下
df['new_col'] = df.apply(lambda x: {col[1]:x[1], col[2]:x[2]}, axis =1)
這將產生以下 output。
df
col1 col2 col3 new_col
0 cat black small {'col2': 'black', 'col3': 'small'}
1 dog white medium {'col2': 'white', 'col3': 'medium'}
2 mice grey tinny {'col2': 'grey', 'col3': 'tinny'}
然后使用 df.drop 刪除不需要的列
這應該會產生所需的 output。
df.drop(['col2', 'col3'], axis = 1)
col1 new_col
0 cat {'col2': 'black', 'col3': 'small'}
1 dog {'col2': 'white', 'col3': 'medium'}
2 mice {'col2': 'grey', 'col3': 'tinny'}
對於給定要求,我建議使用 itertuples 生成字典列表並將其分配給 dataframe,如下所示
import pandas as pd
data = {'col1': ['cat', 'dog', 'mice'], 'col2' : ['black', 'white', 'grey'], 'col3' : ['small', 'medium', 'tinny'], 'col4': ['lovely','brave','fast']}
df = pd.DataFrame(data)
def getDictColumn_df1(df, new_col_name="newcol", cols_from_start=1):
df[new_col_name] = tuple(map(lambda row: row._asdict(), df.iloc[:,cols_from_start:].itertuples()))
return df[['col1', new_col_name]]
getDictColumn_df1(df)
要了解有關 itertuples() 的更多信息, 請查看
當您想保留所有索引並將所有值轉換為單個字典時,對於稍微不同的情況,您可以這樣做
def getDictColumn_df2(df, new_col_name="newcol"):
df[new_col_name] = tuple(map(lambda row: row._asdict(), df.itertuples(index=False)))
return df[[new_col_name]]
getDictColumn_df2(df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.