Итак, у меня есть цикл for, который получает ряд значений и выполняет несколько тестов:

list = [1, 2, 3, 4, 5, 6]
df = pd.DataFrame(columns=['columnX','columnY', 'columnZ'])
for value in list:
    if value > 3:
       df['columnX']="A"
    else:
       df['columnX']="B"
       df['columnZ']="Another value only to be filled in this condition"
    df['columnY']=value-1

Как я могу сделать это и хранить все значения в одной строке для каждой итерации цикла, независимо от того, что будет в случае if? Могу ли я оставить некоторые столбцы пустыми?

Я имею в виду что-то вроде следующего процесса:

[create empty row] -> [process] -> [fill column X] -> [process] -> [fill column Y if true] ...

Как:

[index columnX columnY columnZ]
[0        A       0      NULL ]
[1        A       1      NULL ]
[2        B       2     "..." ]
[3        B       3     "..." ]
[4        B       4     "..." ]
-1
Tiago Duque 4 Июл 2019 в 18:19

3 ответа

Лучший ответ

Я не уверен, чтобы понять точно, но я думаю, что это может быть решением:

list = [1, 2, 3, 4, 5, 6]
d = {'columnX':[],'columnY':[]}
for value in list:
    if value > 3:
       d['columnX'].append("A")
    else:
       d['columnX'].append("B")
    d['columnY'].append(value-1)
df = pd.DataFrame(d)

Для второго вопроса просто добавьте еще одно условие

list = [1, 2, 3, 4, 5, 6]
d = {'columnX':[],'columnY':[], 'columnZ':[]}
for value in list:
    if value > 3:
       d['columnX'].append("A")
    else:
       d['columnX'].append("B")
    if condition:
        d['columnZ'].append(xxx)
    else:
        d['columnZ'].append(None)
df = pd.DataFrame(d)
1
Donbeo 4 Июл 2019 в 15:36

В соответствии с примером, который вы привели, я немного изменил ваш код для достижения результата, которым вы поделились:

list = [1, 2, 3, 4, 5, 6]
df = pd.DataFrame(columns=['columnX','columnY', 'columnZ'])
for index, value in enumerate(list):
    temp = []
    if value > 3:
       #df['columnX']="A"
       temp.append("A")
       temp.append(None)
    else:
       #df['columnX']="B"
       temp.append("B")
       temp.append("Another value") # or you can add any conditions
    #df['columnY']=value-1
    temp.append(value-1)
    df.loc[index] = temp

print(df)

Это дает результат:

  columnX        columnY  columnZ
0       B  Another value      0.0
1       B  Another value      1.0
2       B  Another value      2.0
3       A           None      3.0
4       A           None      4.0
5       A           None      5.0

Df.index печатается как: Int64Index ([0, 1, 2, 3, 4, 5], dtype = 'int64')

0
Asif 4 Июл 2019 в 15:51

Вы можете просто подготовить / инициализировать ваш Dataframe с index в зависимости от размера входного списка, а затем получить power из процедуры np.where:

In [111]: lst = [1, 2, 3, 4, 5, 6]
     ...: df = pd.DataFrame(columns=['columnX','columnY', 'columnZ'], index=range(len(lst)))

In [112]: int_arr = np.array(lst)

In [113]: df['columnX'] = np.where(int_arr > 3, 'A', 'B')

In [114]: df['columnZ'] = np.where(int_arr > 3, df['columnZ'], '...')

In [115]: df['columnY'] = int_arr - 1

In [116]: df
Out[116]: 
  columnX  columnY columnZ
0       B        0     ...
1       B        1     ...
2       B        2     ...
3       A        3     NaN
4       A        4     NaN
5       A        5     NaN
0
RomanPerekhrest 4 Июл 2019 в 15:53