網站首頁 編程語言 正文
問題描述
"""
id value
1 A
1 B
1 C
2 D
2 E
2 F
變為:
id value
1 [A,B,C]
2 [D,E,F]
pandas怎么把上面的結構變為下面的形式?
"""
自己的解決方案
import pandas as pd
import numpy as np
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})
data1 = np.array(data.groupby(['id']))#按照id進行分類
# 轉變成array對象之后,可以根據data1[0][1]查看其結構
id_kinds = 2#id的種類,此例比如1、2共兩種
all_value = []
for j in range(2):
value = []
for i in data1[j][1]['value']:
value.append(i)
all_value.append(value)
print(all_value)
#再創建新的dataframe
new_data = pd.DataFrame({'id':[1,2],'value':all_value})
print(new_data)
輸出結果為:
? ?id ? ? ?value
0 ? 1 ?[A, B, C]
1 ? 2 ?[D, E, F]
大神的更優化的解法
解法一:
可以用sum方法,將字符串進行連接
import pandas as pd
import numpy as np
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})
data1 = data.groupby(by='id')['value'].sum()
此時的輸出結果為:
id
1 ? ?ABC
2 ? ?DEF
Name: value, dtype: object
但是還不是我們想要的,因為我們還需要在中間加入逗號分隔
① 我們可以先將原始數據的value都變成“,A”
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})
data['value'] = data['value'].apply(lambda x:','+ x)
② 然后,對其使用sum方法進行字符串相加
data1 = data.groupby(by='id').sum()
此時的輸出結果為,value值之前多了“,”
id ?value
1 ? ,A,B,C
2 ? ,D,E,F
③ 最后,對該列使用apply函數,去除‘,’
data1['value'] = data1['value'].apply(lambda x :[x[1:]])
就得到了最終的結果:
id ?value
1 ? [A,B,C]
2 ? [D,E,F]
解法二:
對分組之后的結果,直接使用apply函數
一行代碼就搞定!
data1 = data.groupby(by='id').apply(lambda x:[','.join(x['value'])])
那為什么可以這么做呢?
首先需要剖析的是,groupby之后的數據結構是什么樣的,它是由元組構成的(分組名,數據塊),數據塊也就是dataframe結構。使用以下方式可以查看groupby之后的對象:
for ID,group in group_df:
? ? print(ID)
? ? print(group)
apply函數中的x作用的即是數據塊(dataframe),通過數據塊取value那一行得到的是Series對象,于是可以使用join方法進行操作。
總結
sum方法不僅可以用于數值計算,還可用于對于一個Series對象而言的字符串相加
a = ['a','b']
c = pd.Series(a).sum()
apply函數非常靈活,不僅可以作用于一個Series對象,還可以作用于一個groupby之后的數據塊
data['value'].apply(lambda x :*****)
data.groupby(by='**').apply(lambda x :*****)
lambda匿名函數可以極大優化精簡我們的代碼,是一個非常靈活好用的函數,記住它!
原文鏈接:https://blog.csdn.net/qq_32618817/article/details/80430841
相關推薦
- 2022-04-30 DataGridView凍結列或行、列順序調整、操作行頭列頭標題的方法_C#教程
- 2022-05-20 SpringCloud系列:springboot改造集成nacos
- 2022-03-17 .NET?6開發TodoList應用實現結構搭建_實用技巧
- 2022-10-07 詳解Python?OpenCV圖像分割算法的實現_python
- 2024-03-10 Spring 非自定義Bean注解
- 2022-10-16 部署k8s集群的超詳細實踐步驟_云和虛擬化
- 2022-07-14 C語言每日練習之統計文本單詞數及高頻詞_C 語言
- 2022-01-13 macOS 升級后 nvm 安裝的 node 和 npm 出錯
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支