Дублирование каждого столбца csv и изменение значений каждой ячейки столбца на основе условия в python - PullRequest
0 голосов
/ 12 июля 2020

Я новый пользователь всего, особенно python и pandas. У меня есть файл .csv с более чем 1000 столбцами и около 250 строками. Значения строк - либо 0 и 1, либо пустые ячейки. Пример файла csv приведен ниже:

  ID       col1   col2    col3  col4 .  . ............... col1000                          
  1          1     0              1                         1
  2          0              1     1                 
  3                1              0                         0                                                                   
  .
  .
  .
  .
 250         0     1              0                         0
         

Есть две вещи, которые я хочу сделать:

Во-первых, я хочу продублировать все 1000 столбцов (кроме столбца ID) с те же значения ячеек и имена столбцов, что и исходные столбцы, а затем поместите каждый скопированный столбец рядом с исходным столбцом в следующем порядке:

col1      col1     col2     col2    col3    col3     col4     col4 ...... col1000      col1000

Во-вторых, я хочу заменить значения в ячейках на основе следующие условия:

Если в исходной ячейке 1, значение в скопированном столбце должно оставаться 1, а если в исходной ячейке столбца 0, то значение скопированного столбца должно быть изменено на - 1. Если исходная ячейка пуста, то значение исходной ячейки и скопированная ячейка должны быть заполнены значениями 0.

Выходной файл csv будет:

  ID     col1    col1   col2   col2   col3    col3   col4   col4 . ........... col1000   col1000                         
  1        1       1      0     -1      0       0      1      1                    1        1
  2        0      -1      0      0      1       1      1      1                    0        0
  3        0       0      1      1      0       0      0     -1                    0       -1                                                          
  .
  .
  .
  .
 250       0      -1     1       1      0       0      0     -1                    0       -1

Я не могу решить ее и очень признателен, если кто-нибудь может мне помочь; Спасибо ...

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Вы можете попробовать это, чтобы увидеть, работает ли это.

import pandas as pd
import numpy as np

Начальные данные

df = pd.DataFrame({'col1':[1,0,np.NaN,np.NaN,1],'col2':[1,0,np.NaN,np.NaN,1],'col3':[1,0,np.NaN,np.NaN,1]})

Сначала сделайте копию оригинального df.

df_copy = df.copy()

Затем замените значения в копии на основе вышеуказанных критериев.

columns =  df_copy.columns
df_copy[columns] = np.where(df_copy[columns]==0,-1,df_copy[columns])

Затем заполните пустые значения 0.

df_copy = df_copy.fillna(0)

Добавьте количество столбцов для сортировки.

df.loc['total'] = np.arange(len(df.columns))
df_copy.loc['total'] = np.arange(len(df_copy.columns))

Затем объедините два df вместе

new_df = pd.concat([df,df_copy],axis=1)

Отсортируйте столбцы, используя строку количества столбцов, затем удалите строку из нового df

new_df = new_df.sort_values(by='total',axis=1)
new_df = new_df.loc[~new_df.index.isin(['total'])]
0 голосов
/ 13 июля 2020

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

# create copied data and concat into original
df2 = pd.concat([df, df.replace(0,-1).fillna(0).drop('ID', axis=1)], 1)

# since column names are same, we need to use index
cols = [x for x in df2.columns if x != 'ID']
cols = dict(enumerate(cols))

# get correct index for column names
cols_index = [x[0] for x in sorted(cols.items(), key=lambda x: x[1])]

# fix column names
idcol = df2[['ID']]
df2 = df2.drop('ID', 1).iloc[:,cols_index]

# add the ID column
df2 = pd.concat([idcol, df2], 1).fillna(0)

print(df2)

   ID  col1  col1  col2  col2  col3  col3
0   1   1.0   1.0   1.0   1.0   1.0   1.0
1   2   0.0   0.0   0.0   0.0   0.0   0.0
2   3   NaN  -1.0   NaN  -1.0   NaN  -1.0
3   4   NaN  -1.0   NaN  -1.0   NaN  -1.0
4   5   1.0   1.0   1.0   1.0   1.0   1.0

Пример данных

df = pd.DataFrame({'ID': list(range(1,6)),
                   'col1':[1,0,np.NaN,np.NaN,1],
                   'col2':[1,0,np.NaN,np.NaN,1],
                   'col3':[1,0,np.NaN,np.NaN,1]})
0 голосов
/ 12 июля 2020

Вы можете использовать это (аналогичный подход, как и другой ответ с использованием pandas встроенных функций для замены):

df2 = df.copy().replace(0,-1).fillna(0).drop(['ID'],1)
df = pd.concat([df.fillna(0),df2],1)

вывод и ввод образца (для другого образца ввода, но сравнение столбцов):

ввод:

     ID  col1  col2  col3  col4  col1000
0     1     1     0     1   1.0      NaN
1     2     0     1     1   NaN      NaN
2     3     1     0     0   NaN      NaN
250   250     0     1     0   0.0      NaN

вывод:

    ID  col1  col2  col3  col4 ... col1000  col1  col2  col3  col4 ... col1000
0    1     1     0     1   1.0      0.0     1    -1     1   1.0      0.0
1    2     0     1     1   0.0      0.0    -1     1     1   0.0      0.0
2    3     1     0     0   0.0      0.0     1    -1    -1   0.0      0.0
...
250  250     0     1     0   0.0      0.0    -1     1    -1  -1.0      0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...