Добавление новых строк в существующие столбцы на основе условия - PullRequest
1 голос
/ 13 января 2020

У меня есть фрейм данных, в котором есть четыре столбца: диапазон, погода, флаг и расчет. Мне нужно взять комбинации из трех списков для трех столбцов (диапазон, погода и флаг) и проверить, не существует ли комбинация для эти три столбца затем добавляют новую строку в фрейм данных.

range   weather  flag   calculation
 0-5    good      y      12
 5-6    good      n      14
 0-5    bad       n      2
 5-6    worse     y      5

Вывод выглядит следующим образом:

range   weather  flag   calculation
 0-5    good      y       12
 0-5    bad       n        2
 0-5    good      n       null
 0-5    worse     n       null
 0-5    bad       y       null
 0-5    worse     y       null
 5-6    good      n       14
 5-6    worse     y        5
 5-6    bad       n       null
 5-6    worse     n       null
 5-6    bad       y       null
 5-6    good      y       null

Код, который я пробовал, выглядит следующим образом:

r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']
for i in r:
    for j in w:
        for k in f:
            if i in data1['range'].values and j in data1['weather'].values and k in data1['flag'].values:
            print(i,j,k)
            print("yes")      
        else:
            print(i,j,k)
            print("no")
            data1=data1.append([{'bl_flag':j},{'weather_status':k}], ignore_index=True)
        print(data1)

Приведенный выше код не проверяет все 3 комбинации присутствуют в одной строке, если они отсутствуют в одной строке, то они должны быть добавлены в фрейм данных.

Ответы [ 2 ]

1 голос
/ 21 января 2020
r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']
for i in r:
    for j in f:
        for k in w:          
            count=data1[data1["range"]==i].groupby(["range","weather","flag"]).apply(lambda x: x[(x["flag"]==j)&(x["weather"]==k).any()])              
            if count.size==0:
                data1=data1.append({'flag':j,'weather':k}, ignore_index=True)
1 голос
/ 17 января 2020

Один из подходов к этой проблеме - создать DataFrame со всеми возможными комбинациями значений из столбцов "range", "weather" and "flag", а затем объединить новый DataFrame с исходным DataFrame, используя outer join.

Чтобы создать фрейм данных со всеми возможными комбинациями:

r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']

res = [[i, j, k] for i in r  
                 for j in w 
                 for k in f] 

cls = ["range","weather","flag"]

df1 = pd.DataFrame(res,columns  =  cls)
df1

Вывод:

   range weather flag
0    0-5    good    n
1    0-5    good    y
2    0-5     bad    n
3    0-5     bad    y
4    0-5   worse    n
5    0-5   worse    y
6    5-6    good    n
7    5-6    good    y
8    5-6     bad    n
9    5-6     bad    y
10   5-6   worse    n
11   5-6   worse    y

Теперь вы можете объединить этот фрейм данных с оригинальным фреймом данных, используя outer объединение в следующим образом:

new_df = pd.merge(df1, orignal_df,  how='outer', left_on=cls, right_on = cls)

Вывод:

   range weather flag  calculation
0    0-5    good    n          NaN
1    0-5    good    y          NaN
2    0-5     bad    n          NaN
3    0-5     bad    y          NaN
4    0-5   worse    n          NaN
5    0-5   worse    y          NaN
6    5-6    good    n          NaN
7    5-6    good    y          NaN
8    5-6     bad    n          NaN
9    5-6     bad    y          NaN
10   5-6   worse    n          NaN
11   5-6   worse    y          NaN
12   0-5    good    y         12.0
13   5-6    good    n         14.0
14   0-5     bad    n          2.0
15   5-6   worse    y          5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...