Итерация по строкам (два цикла) Автоматизация Pandas DataFrame - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующая итерация (для l oop) для каждой строки в зависимости от индикаторов 'H' и 'G' в df1. Создает новый столбец с произведением выбранных индикаторов. Теперь я хотел бы, чтобы это автоматически отключалось для всех индикаторов (если у меня больше, чем «H» и «G»). К сожалению, я изо всех сил пытаюсь поместить это в словарь.

Может кто-нибудь помочь с этим? Спасибо и хорошей недели.

   df1 =pd.DataFrame({'Country':['Armenia','Azerbaidjan','Belarus','Armenia','Azerbaidjan','Belarus'],\
                 'Indictaor':['G','G','G','H', 'H', 'H'],'2005':[3,4,5,6,7,4],'2006':[6,3,1,3,5,6]})

    df2 = pd.DataFrame({'Year':[2005,2006,2005,2006],
                        'Country1':['Armenia','Armenia','Azerbaidjan','Azerbaidjan'],
                        'Country2': ['Belarus','Belarus','Belarus','Belarus']})

    df3 = pd.DataFrame({'Year':[2005,2006,2005,2006],                   
                        'Country2': ['Belarus','Belarus','Belarus','Belarus'],
                        'Country1':['Armenia','Armenia','Azerbaidjan','Azerbaidjan'],
                         'IndictaorGProduct':[15,6,35,5],
                          'IndictaorHProduct':[24,18,28,30]})

    gprod = []
    hprod =[]

for row in df4.iterrows() :
        c1 = row[1][2]
        c2 = row[1][1]
        yr = str(row[1][0])
        g1 = df1.loc[(df1['Country']==c1)&(df1['Indictaor']=='G')]
        g1val = g1[yr].values[0]
        g2 = df1.loc[(df1['Country']==c2)&(df1['Indictaor']=='G')]
        g2val = g2[yr].values[0]
        print(g1val, g2val, g1val*g2val)
        gprod.append(g1val*g2val)
    df4['GProduct'] = gprod

for row in df4.iterrows() :
        c1 = row[1][2]
        c2 = row[1][1]
        yr = str(row[1][0])
        g1 = df1.loc[(df1['Country']==c1)&(df1['Indictaor']=='H')]
        g1val = g1[yr].values[0]
        g2 = df1.loc[(df1['Country']==c2)&(df1['Indictaor']=='H')]
        g2val = g2[yr].values[0]
        print(g1val, g2val, g1val*g2val)
        gprod.append(g1val*g2val)
    df4['HProduct'] = hprod

1 Ответ

1 голос
/ 27 января 2020

Это зависит от того, откуда вы получаете индикаторы. Вы выбираете их или вы получаете их из колонки?

Если вы получаете их из соответствующего столбца, вы можете использовать столбец, чтобы получить список с уникальными значениями из столбца. Затем вы можете l oop над значениями в секунду l oop. Но учтите, что в зависимости от размера ваших данных это может быть не очень эффективно.

Однако вот что вы можете сделать:

import pandas as pd

df1 = pd.DataFrame({'Country': ['Armenia', 'Azerbaidjan', 'Belarus', 'Armenia', 'Azerbaidjan', 'Belarus'], \
                    'Indictaor': ['G', 'G', 'G', 'H', 'H', 'H'], '2005': [3, 4, 5, 6, 7, 4],
                    '2006': [6, 3, 1, 3, 5, 6]})

df2 = pd.DataFrame({'Year': [2005, 2006, 2005, 2006],
                    'Country1': ['Armenia', 'Armenia', 'Azerbaidjan', 'Azerbaidjan'],
                    'Country2': ['Belarus', 'Belarus', 'Belarus', 'Belarus']})

df3 = pd.DataFrame({'Year': [2005, 2006, 2005, 2006],
                    'Country2': ['Belarus', 'Belarus', 'Belarus', 'Belarus'],
                    'Country1': ['Armenia', 'Armenia', 'Azerbaidjan', 'Azerbaidjan'],
                    'IndictaorGProduct': [15, 6, 35, 5],
                    'IndictaorHProduct': [24, 18, 28, 30]})

cols = ['Year', 'Country2', 'Country1']
df4 = pd.DataFrame(columns=cols)
df4['Year'] = df2['Year']
df4['Country1'] = df2['Country1']
df4['Country2'] = df2['Country2']




indicators = df1["Indictaor"].unique() # get all the unique indicators from the indicators column, you could also manually have alist with the indicators you want to loop over

for i in indicators:
    prod = []
    for row in df4.iterrows():
        c1 = row[1][2]
        c2 = row[1][1]
        yr = str(row[1][0])
        g1 = df1.loc[(df1['Country'] == c1) & (df1['Indictaor'] == i)] # compare to the indicator in the list
        g1val = g1[yr].values[0]
        g2 = df1.loc[(df1['Country'] == c2) & (df1['Indictaor'] == i)]
        g2val = g2[yr].values[0]
        print(g1val, g2val, g1val * g2val)
        prod.append(g1val * g2val)
    colname = "".join([i,"Product"])
    df4[colname] = prod

print("Done")
...