DataFrame活动列数据处理与统计分析问题求助
活动数据清洗与统计问题解决
原始数据与当前问题
用户的原始DataFrame前10行:
full_date weekday mood activities 0 2023-07-31 Monday meh 自炊 | nothing at all | Game 1 2023-07-30 Sunday meh nothing at all | Game 2 2023-07-29 Saturday meh pizza | nothing at all | Game | outside food | 3 2023-07-28 Friday meh nothing at all | Game | outside food 4 2023-07-27 Thursday meh nothing at all | Game | argument 5 2023-07-26 Wednesday meh nothing at all | Game 6 2023-07-25 Tuesday meh 自炊 | nothing at all | Game | outside food 7 2023-07-24 Monday meh Game 8 2023-07-23 Sunday meh 自炊 | with a friend | family like gathering | Game | argument 9 2023-07-22 Saturday meh self teaching | nothing at all | Game
执行清洗拆分操作后:
df["activities"]=df["activities"].astype("string") df["activities"]=df["activities"].str.split("|")
遇到三个核心问题:
- 拆分后的活动元素存在首尾空格,
strip()无效,replace(" ","")会破坏"nothing at all"这类带空格的活动名 - 遍历统计当日活动数量时触发
TypeError: object of type 'NAType' has no len() - 统计负面活动数量的代码无效果
逐个问题解决
1. 修复活动元素的首尾空格问题
不要直接用全局替换,而是拆分后对每个元素单独去除首尾空格,同时过滤空字符串(比如原始数据末尾的|产生的空元素):
# 拆分+去除每个元素首尾空格+过滤空值 df["activities"] = df["activities"].str.split("|").apply(lambda x: [item.strip() for item in x if item.strip()])
处理后,活动列表会变成["自炊", "nothing at all", "Game"]这类格式,既保留了合法空格,又去掉了多余的首尾空格。
2. 统计当日活动数量(解决NAType错误)
放弃手动循环,用pandas矢量化操作,自动处理NA值:
# 直接对列表列求长度,NA值填充为0 df["actions"] = df["activities"].str.len().fillna(0).astype(int)
str.len()可以直接获取每个列表的长度,fillna(0)处理NA类型数据,避免报错,效率远高于手动循环。
3. 统计当日负面活动数量
首先修正负面列表的空格(和处理后的活动元素匹配),然后用apply统计每个列表中属于负面列表的元素个数:
# 修正负面列表,去掉多余空格 negative = ["nothing at all", "Game", "argument", "outside food"] # 统计每行的负面活动数量 df["negative_acts"] = df["activities"].apply(lambda x: sum(1 for item in x if item in negative) if isinstance(x, list) else 0)
这段代码会遍历每个活动列表,逐个检查元素是否在负面列表中,统计符合条件的数量,同时处理非列表类型的NA数据。
内容的提问来源于stack exchange,提问作者Antony Artoonian
相关产品推荐
相关产品推荐

