Как сделать цикл в столбцах и строках одновременно для установки нуля в некоторых позициях кадра данных? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть фрейм данных с 14000 строками и информацией, связанной в столбцах с 2010 по 2050, которые представляют годы.Мне нужно установить ноль, где год (df.columns - 2010 до 2050) больше, чем значение, связанное со столбцом year_out (например, в первой строке значение равно 2020)

years = np.arange(2013,2050)
rows  = np.arange(0, 14000)

df
    Plan         2010  2020  2030  2040  2050  year_out
0  Australia     500   500   500   500   500    2020  
1  Australia     400   400   400   400   400    2020  
2  New Zealand   300   300   300   300   300    2020  
3  New Zealand   200   200   200   200   200    2020  

Iпопробовал

for df.columns in years:
for df.index in rows:
df.loc[df.index, "year_out"]
    if df.loc[df.index, "year_out"] > df.columns:
        #print('yes')
        df.loc[df.index, df.columns] = 0

Я хотел бы получить

    Plan         2010  2020  2030  2040  2050  year_out
0  Australia     500   500     0     0     0    2020  
1  Australia     400   400   400     0     0    2030  
2  New Zealand   300   300   300     0     0    2040  
3  New Zealand   200   200   200   200     0    2050  

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вот путь от numpy boradcast

youcolumns=['2010','2020','2030','2040','2050']
v=pd.DataFrame(df[youcolumns].columns.values.astype(int)<df.year_out.values[:,None],columns=youcolumns,index=df.index)
df[youcolumns]=df[youcolumns][v]
df[youcolumns]=df[youcolumns].fillna(0)
df

Out[151]: 
   2010   2020   2030   2040  2050         Plan  year_out
0   500    0.0    0.0    0.0   0.0    Australia      2020
1   400  400.0    0.0    0.0   0.0    Australia      2030
2   300  300.0  300.0    0.0   0.0  New Zealand      2040
3   200  200.0  200.0  200.0   0.0  New Zealand      2050
0 голосов
/ 03 октября 2018

IIUC, вы можете использовать Pandas apply и обновлять каждую строку, основываясь на ее year_out значении:

def updater(row):
    for col in row.index:
        try:
            if int(col) >= row['year_out']:
                row[col] = 0
        except ValueError:
            pass
    return row

df.apply(updater, axis=1)
          Plan  2010  2020  2030  2040  2050  year_out
0    Australia   500     0     0     0     0      2020
1    Australia   400   400     0     0     0      2030
2  New Zealand   300   300   300     0     0      2040
3  New Zealand   200   200   200   200     0      2050

С примерами данных:

data =  {'Plan': {0: 'Australia', 1: 'Australia', 2: 'New Zealand', 3: 'New Zealand'},
 '2010': {0: 500, 1: 400, 2: 300, 3: 200},
 '2020': {0: 500, 1: 400, 2: 300, 3: 200},
 '2030': {0: 500, 1: 400, 2: 300, 3: 200},
 '2040': {0: 500, 1: 400, 2: 300, 3: 200},
 '2050': {0: 500, 1: 400, 2: 300, 3: 200},
 'year_out': {0: 2020, 1: 2030, 2: 2040, 3: 2050}}
df = pd.DataFrame(data)

df
          Plan  2010  2020  2030  2040  2050  year_out
0    Australia   500   500   500   500   500      2020
1    Australia   400   400   400   400   400      2030
2  New Zealand   300   300   300   300   300      2040
3  New Zealand   200   200   200   200   200      2050

Примечание: ваш ожидаемыйВыходные данные чередуются между установкой столбцов в ноль, когда они либо >= против >, чем year_out.Я предполагаю, что это ошибка, и я установил непротиворечивое правило в этом ответе (легко изменить в случае необходимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...