Векторизованный метод для добавления строк данных в столбцы и наоборот - PullRequest
4 голосов
/ 23 января 2020

Мой фрейм данных выглядит следующим образом:

df = pd.DataFrame({'a': {'d': 1, 'e': 0, 'f': 1, 'g': 1},
                   'b': {'d': 0, 'e': 0, 'f': 0, 'g': 1},
                   'c': {'d': 0, 'e': 1, 'f': 1, 'g': 0}})

, что дает:

>>> df
   a  b  c
d  1  0  0
e  0  0  1
f  1  0  1
g  1  1  0

Для каждой строки в фрейме данных я хотел бы добавить новый столбец 0 s и для каждого столбца в кадре данных я хотел бы добавить новую строку 0 с.

Я пытался решить эту проблему до сих пор следующим образом:

edges = df.columns

for i in df.index:
    df[i] = [0 for _ in range(len(df.index))]

for e in edges:
    df = df.append(pd.Series({c:0 for c in df.columns},name=e))

Что дает желаемый результат:

>>> df
   a  b  c  d  e  f  g
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0

Есть ли векторизованная альтернатива?

Ответы [ 3 ]

4 голосов
/ 23 января 2020

Вот один из способов использования reindex:

(df.reindex(df.columns.append(df.index), 
           axis=1, 
           fill_value =0)
  .reindex(df.index.append(df.columns), 
           axis=0, 
           fill_value =0))

print(df_new)

   a  b  c  d  e  f  g
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0
3 голосов
/ 23 января 2020

Создать словарь из fromkeys, затем распаковать его, затем использовать assign и T, затем assign, затем T:

print(df.assign(**dict.fromkeys(df.index, 0)).T.assign(**dict.fromkeys(df.columns, 0)).T)

Вывод:

   a  b  c  d  e  f  g
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0
3 голосов
/ 23 января 2020

Используйте DataFrame.reindex с columns и index, новые значения должны быть созданы с помощью Index.append:

df1 = df.reindex(columns=df.columns.append(df.index), 
                 index=df.index.append(df.columns), 
                 fill_value = 0)
print (df1)
   a  b  c  d  e  f  g
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0

или Index.union:

df1 = df.reindex(columns=df.columns.union(df.index, sort=False), 
                 index=df.index.union(df.columns, sort=False), 
                 fill_value = 0)
print (df1)
   a  b  c  d  e  f  g
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...