【问题标题】:dataframes manipulation and merging python数据框操作和合并python
【发布时间】:2018-06-21 12:10:52
【问题描述】:
  I have a dataframe,df1 

        inp   aco   drtn                
      2.3.6  dp   Less than 1 min         
      2.3.6  ft   5-10 min        
      2.5.9  dp   More than 1 hour        
      0.8.0  dp    1-5 min                
      2.3.6  dp   10-30 min               
      2.3.6  dp   More than 1 hour        
      0.8.0  dp   Less than 1 min         
      0.8.0  dp   1-5 min                 

df1 应通过计算出现次数按 3 列分组。新的数据框 df2 将如下所示:

       inp   aco   drtn                count
      2.3.6  dp   Less than 1 min         1
      2.3.6  ft   5-10 min                1
      2.5.9  dp   More than 1 hour        1
      0.8.0  dp    1-5 min                2
      2.3.6  dp   10-30 min               1
      2.3.6  dp   More than 1 hour        1
      6.2.6  dp   1-5 min                 1

列:“drtn”应转换为新列:“convrt”。 例如,此转换列将如下所示:小于 1 分钟=0.59 分钟,大于 1 小时=61 分钟,1-5 分钟=5 分钟,5-10 分钟=10,10-30 分钟=30 分钟。另一个新列:'calc' 应该定义为 'count' 列的值乘以列中的值: 'convrt' 。然后一个新的数据帧,df3 应该如下所示:

       inp   aco   drtn                 count   convrt   calc
      2.3.6  dp   Less than 1 min         1     0.59     0.59
      2.3.6  ft   5-10 min                1      10      10
      2.5.9  dp   More than 1 hour        1      61      61
      0.8.0  dp    1-5 min                2       5      10
      2.3.6  dp   10-30 min               1      30      30
      2.3.6  dp   More than 1 hour        1      61      61
      6.2.6  dp   1-5 min                 1       5       5

然后是一个新的数据框,df4,由列过滤:'aco'。例如:只有具有 dp 的值才应该被保留。然后是一个新的列:pct,它计算列中变化的百分比:'calc'。

       inp   aco   drtn                 count   convrt   calc   pct
      2.3.6  dp   Less than 1 min         1     0.59     0.59   0.003
      2.5.9  dp   More than 1 hour        1      61      61     36.40
      0.8.0  dp    1-5 min                2       5      10     0.060
      2.3.6  dp   10-30 min               1      30      30     17.90 
      2.3.6  dp   More than 1 hour        1      61      61     36.40
      6.2.6  dp   1-5 min                 1       5       5     0.030 

然后是一个新的数据框,df5,带有一个新列:'pct',它将列中的所有值相加) 并乘以 100,索引命名为 column:'aco' 的过滤值。然后,一个新列“totalCalcFilteredColumn”获取该列的总和:“calc”在过滤的数据帧中,df4。 另一列名为:'diff',它将df3的列:'calc'和df4的列:'calc'中的所有值相加,然后进行减法(df3-df4)

        pctTime      totalCalcFilteredColumn     diff    
  dp    94.37         167.59                     10        
  ft    5.63           10                       167.59    

我该怎么办?

【问题讨论】:

  • 天哪,这无异于让别人为你完成整个项目。请提出单独的问题,这wayyyy超出了SO的范围。
  • 没有进展!我已经有一段时间了!
  • 就像我说的。一次一个问题。你有3-4个。现在取出除第一个以外的所有内容。然后,打开另一个问题,然后问下一部分……等等。
  • 你搜索了吗?为什么不从谷歌搜索开始?你很清楚每一步你想要什么。把它变成英文然后搜索,伙计。例如,“通过计算出现次数按 3 列分组”可以变成谷歌搜索“”“按列分组并计算出现次数”“”
  • @Tai 我真的做到了!我的第一个瓶颈是:df=pd.DataFrame(df, columns= ['inp','aco','drtn'])df=df .groupby(['inp'])['aco'].value_counts().sort_values (ascending=False).reset_index(name='count')

标签: python pandas


【解决方案1】:

设置:

temp=u"""inp;aco;drtn
2.3.6;dp;Less than 1 min
2.3.6;ft;5-10 min
2.5.9;dp;More than 1 hour
0.8.0;dp;1-5 min
2.3.6;dp;10-30 min
2.3.6;dp;More than 1 hour
0.8.0;dp;1-5 min
6.2.6;dp;1-5 min"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'

df = pd.read_csv(pd.compat.StringIO(temp), sep=";")
print (df)
     inp aco              drtn
0  2.3.6  dp   Less than 1 min
1  2.3.6  ft          5-10 min
2  2.5.9  dp  More than 1 hour
3  0.8.0  dp           1-5 min
4  2.3.6  dp         10-30 min
5  2.3.6  dp  More than 1 hour
6  0.8.0  dp           1-5 min
7  6.2.6  dp           1-5 min

解决方案:

d = {'1-5 min': 5, '10-30 min': 30, '5-10 min': 10,
'Less than 1 min': 0.59, 'More than 1 hour': 61}

df = df.groupby(['inp', 'aco', 'drtn'], sort=False).size().reset_index(name='count')
#map column by dictionary
df['convrt'] = df['drtn'].map(d)
df['calc'] = df['convrt'].mul(df['count'])
#divide by groups - transform create Series with same size as original df
df['pct'] = df['calc'].div(df.groupby('aco')['calc'].transform('sum')).mul(100)
print (df)
     inp aco              drtn  count  convrt   calc         pct
0  2.3.6  dp   Less than 1 min      1    0.59   0.59    0.352050
1  2.3.6  ft          5-10 min      1   10.00  10.00  100.000000
2  2.5.9  dp  More than 1 hour      1   61.00  61.00   36.398353
3  0.8.0  dp           1-5 min      2    5.00  10.00    5.966943
4  2.3.6  dp         10-30 min      1   30.00  30.00   17.900829
5  2.3.6  dp  More than 1 hour      1   61.00  61.00   36.398353
6  6.2.6  dp           1-5 min      1    5.00   5.00    2.983472

#aggregate sum 
df = df.groupby('aco')['calc'].sum().reset_index(name='totalCalcFilteredColumn')
summed = df['totalCalcFilteredColumn'].sum()
df['pctTime'] = df['totalCalcFilteredColumn'].div(summed).mul(100)
#rsub means sub from right  summed - df['calc']
df['diff'] = df['totalCalcFilteredColumn'].rsub(summed)
print (df)
  aco  totalCalcFilteredColumn    pctTime    diff
0  dp                   167.59  94.369052   10.00
1  ft                    10.00   5.630948  167.59

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2022-01-14
    • 2014-12-06
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2021-11-14
    • 2021-06-25
    相关资源
    最近更新 更多