Создавать столбцы на основе условий

pylearner спросил: 28 апреля 2018 в 08:36 в: python

У меня есть dataframe, который содержит имена столбцов ниже

Dataset1:

df1_columns = [adult    adultold    old old1    old2    old3    old4    old6]In dataframe2 i have columns subset of column 1, now I want to add columns which I have in dataframe 1.

Dataframe2:

adult   adultold    old2    old5
0   0   1   0
1   0   0   0
1   0   0   0
0   0   0   0
1   0   0   0
1   0   0   0
0   0   0   1
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0

Я хочу сделать что-то подобное на основе имен столбцов dataframe1 и добавить те же имена столбцов в набор данных 2 с нулями.

dataframe1.columns = [adult,    adultold,   old,    old1,   old2,   old3,   old4,   old6]dataframe2.columns = [adult,    adultold,   old2    old5]if x in dataframe1.columns:
     if y in dataframe2.columns:
           pass
     else:
           dataframe2['y'] = (fill with zeros)

вывод:

adult   adultold    old old1    old2    old3    old4    old6
0   0   1   0   0   0   0   0
1   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0
0   0   0   1   0   0   0   0
0   0   0   0   0   0   0   0

Можно ли получить новую фреймворк данных в порядке, как в df1?


2 ответа

Есть решение
jezrael ответил: 28 апреля 2018 в 08:51

Вы можете использовать numpy.setdiff1d, если входы представляют собой списки имен столбцов для Series и для новых имен столбцов assign:

s = pd.Series(0, index=np.setdiff1d(dataframe1_columns, dataframe2_columns))
print (s)
old2    0
old3    0
old4    0
old6    0
dtype: int64df = dataframe2.assign(**s)
print (df)
    adult  adultold  old  old1  old2  old3  old4  old6
0       0         0    1     0     0     0     0     0
1       1         0    0     0     0     0     0     0
2       1         0    0     0     0     0     0     0
3       0         0    0     0     0     0     0     0
4       1         0    0     0     0     0     0     0
5       1         0    0     0     0     0     0     0
6       0         0    0     1     0     0     0     0
7       0         0    0     0     0     0     0     0
8       0         0    0     0     0     0     0     0
9       0         0    0     0     0     0     0     0
10      0         0    0     0     0     0     0     0
jezrael ответил: 28 апреля 2018 в 08:47
@pylearner - проверить отредактированный ответ.
Vivek Kalyanarangan ответил: 28 апреля 2018 в 08:47
@jezrael пожалуйста, объясните. Это потрясающий лайнер!
jezrael ответил: 28 апреля 2018 в 08:48
Конечно, дай мне секунду.
pylearner ответил: 28 апреля 2018 в 08:49
@VivekKalyanarangan, jezrael - потрясающий кодер для меня. Многому научиться у него. Спасибо Jez.
Vivek Kalyanarangan ответил: 28 апреля 2018 в 08:42

Использовать -

list_of_cols_not_in_df2 = df.columns.difference(df2.columns) # @jez thanks for teaching difference
pd.concat([df2, pd.DataFrame(0, df2.index, list_of_cols_not_in_df2 )], axis=1)

, используя объединение вместо concat

df2.join(pd.DataFrame(0, df2.index, list_of_cols_not_in_df2 ))
Выход
    adult   adultold    old old1    old2    old3    old4    old6
0   0   0   1   0   0   0   0   0
1   1   0   0   0   0   0   0   0
2   1   0   0   0   0   0   0   0
3   0   0   0   0   0   0   0   0
4   1   0   0   0   0   0   0   0
5   1   0   0   0   0   0   0   0
6   0   0   0   1   0   0   0   0
7   0   0   0   0   0   0   0   0
8   0   0   0   0   0   0   0   0
9   0   0   0   0   0   0   0   0
10  0   0   0   0   0   0   0   0
pylearner ответил: 28 апреля 2018 в 08:45
что, если я знаю только имена столбцов, но не dataframe, dataframe1_columns = [для взрослых, для взрослых, для старых, для старых, старых2, для старых3, для старых4, для старых6)
Vivek Kalyanarangan ответил: 28 апреля 2018 в 08:46
@pylearner, то вы используете только оператор concat / join
Vivek Kalyanarangan ответил: 28 апреля 2018 в 08:50
@pylearner в соответствии с обновленным qstn, как jezrael, так и я поставил то, что вам нужно. Как эти решения отличаются от того, что вы хотите?
pylearner ответил: 28 апреля 2018 в 08:55
У меня вообще нет dataframe1 ... У меня есть список имен в моем случае. Так что он это сделал.