python - 如何将 Pandas 数据框行转换为带条件的逗号分隔值

标签 python pandas

我有一个 pandas 数据框:

id =[30,30,40,40,30,40,55,30]
month =[1,3,11,4,10,2,12,12]
average=[90,80,50,92,18,15,16,55]
sec =['id1','id1','id3','id4','id2','id2','id1','id1']

df = pd.DataFrame(list(zip(id,sec,month,average)),columns =['id','sec','month','Average'])

我们想再添加一列以逗号分隔以下条件的月份

  1. 需要排除id2秒
  2. 平均分低于 90

期望的输出

enter image description here

我试过下面的代码但没有得到想要的输出

final=pd.DataFrame()
for i in set(sec):
  if i !='id2': #Exclude id2
    d2 =df[df['sec']==i]
    d2=df[df['average']<90]  # apply below 90 condition
    d2=d2[['id','month']].groupby(['id'], as_index=False).agg(lambda x: ', '.join(sorted(set(x.astype(str))))) #comma seperated data
    d2.rename(columns={'month':'problematic_month'},inplace=True)
    d2['sec']=i
    tab =df.merge(d2,on =['id','sec'], how ='inner')
    final =final.append(tab)
  else:
    d2 =df[df['sec']==i]
    d2['problematic_month']=np.NaN
    final =final.append(d2)

请建议任何其他方式(不合并)以获得所需的输出

最佳答案

另一种使用groupby+transform的方式

import calendar
d = dict(enumerate(calendar.month_abbr))

s = df['month'].map(d).where(df['sec'].ne("id2")& (df['Average'].lt(90)))
col = s.groupby([df["id"],df['sec']]).transform(lambda x: ','.join(x.dropna()))

out = df.assign(problematic_column=col.replace("",np.nan)).sort_values(['id','sec'])

print(out)

   id  sec  month  Average problematic_column
0  30  id1      1       90            Mar,Dec
1  30  id1      3       80            Mar,Dec
7  30  id1     12       55            Mar,Dec
4  30  id2     10       18                NaN
5  40  id2      2       15                NaN
2  40  id3     11       50                Nov
3  40  id4      4       92                NaN
6  55  id1     12       16                Dec

步骤:

  1. 将月份列映射到日历以获得月份缩写。
  2. 仅当条件匹配时才保留值。
  3. 使用 groupby 并转换为 dropna 并通过逗号连接。

关于python - 如何将 Pandas 数据框行转换为带条件的逗号分隔值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70485940/

相关文章:

python - groupby 并根据另一列的值保留一列的信息

python - 按原样进行分组和堆叠的条形图

python - Spyder 不在变量资源管理器中显示矩阵

Python Pandas : Subsetting data frame both by rows and columns?

python - 将一年中的几周分开并计算数据框中的平均值

python - 在列表的数据框中找到最常见的对

python - 将 pandas 系列中的值分开并将它们全部堆叠到列表中?

python - 如何通过request.user过滤django-tastypie的ToManyField?

python - 如何检测脚本是从 Django 还是命令提示符运行?

python - 如何计算 Pandas 数据帧上的非字母数字字符