【问题标题】:How to apply for loop to append rows based on multiple calculation?如何申请循环根据多次计算追加行?
【发布时间】:2021-10-08 21:13:00
【问题描述】:

我有一个非常复杂的情况,要根据不同的列附加带有sum of populationone agg. 函数的行。在下面找到:

请确保我在所有column 中都有多行,例如"year"range (2019,2040)"con" 有多个国家/地区。

import pandas as pd
d = { 'year': [2019,2020,2019,2020,2019,2020], 'age': [10,10,20,20,30,30], 'con': ['UK','UK','UK','US','US','US'],'population': [1,2,300,400,1000,2000]}
df = pd.DataFrame(data=d)
df

 year   age con population
 2019   10  UK      1
 2020   10  UK      2
 2021   20  UK      300
 2019   20  US      400
 2020   30  US      1000
 2021   30  US      2000

需要输出:

year    age   con     population
2019    10     UK          1
2020    10     UK          2
2019    10     UK          300
2020    20     US          400
2019    20     US          1000
2020    20     US          2000
2019    10-20  UK child    301         #addition of row 1 + row 3  
2020    10-20  UK child    402         #addition of 1+2
2019    20-30  UK teen     1000+ age30 population

我正在寻找一个循环函数,所以我申请con col

我在努力,失败了!!!

variable_list = ['UK', 'US']
ranges = [[0,10], [10,20], [20,30]]


categories = ["Child", "teen", "work"]

year = [x for x in range(2019,2022)]

q = df#df.loc[(df["Kategorie 1"].str.strip()==BASE)]
q["age2"] = pd.to_numeric(q["age"])

sums_years = {}


                   
for variable in variable_list:
  c = 0
  u = q.loc[q["cat2"]==variable]  
  for r in ranges:
    cat = "Germany: " + categories[c]
    for year in date:
      group = str(r[0])+'-'+str(r[1])
      n = variable + "_" + group
      if n not in sums_years:
        sums_years[n] = {}

      s = u.loc[(u['year']==year) & (u["age"]>=r[0]) & (u["age"]<=r[1]), 'population'].sum()
     ```

也喜欢一种情况

df_uk = df[df.con=='UK'].reset_index(drop=True)
div =['child','teen','working']
c = [div[i] for i in range(len(df_uk))] #list to get element from div
y = [i+2018 for i in range(1,len(df_uk)+1)] #list of 2019,2020,2021
x = [[[0,10], [10,20], [20,30]] for i in range(1,len(df_uk)+1)]

d={'year':y, 'age':x, 'con':c, 'population': (df_uk['value'] + #adds_something).values}

df_new = pd.DataFrame(data=d)

df = pd.concat([df, df_new], ignore_index=True)

对不起,如果它一团糟..我问过别人但没有帮助...我相信可以有简单和更好的循环功能。请帮忙!!!! 有没有更好的方法来融合数据框并进行所有计算.. 或重组数据框。

【问题讨论】:

  • "c = [i{div} for" 应该是 div[i],对吧?
  • 是的,第二个选项它的手册,我正在寻找一个循环解决方案。不过还是谢谢指正。

标签: python pandas dataframe function for-loop


【解决方案1】:
d = { 'year': [2019,2020,2021,2020,2019,2021], 
      'age': [10,20,30,10,20,30], 
      'con': ['UK','UK','UK','US','US','US'],
      'population': [1,2,300,400,1000,2000]}
df = pd.DataFrame(data=d)
df2 = df.copy()

criteria = [df2['age'].between(0, 10), 
            df2['age'].between(11, 20), 
            df2['age'].between(21, 30)]

values = ['child', 'teen', 'work']

df2['con'] = df2['con']+'_'+np.select(criteria, values, 0)
df2['population'] = df.groupby(['con', 'age']).sum()\
                      .groupby(level=0).cumsum()\
                      .reset_index()['population']

final = pd.concat([df, df2])

【讨论】:

猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 2021-07-19
  • 2013-09-06
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2019-01-18
  • 2012-04-25
相关资源
最近更新 更多