python - usar - remover linhas duplicadas pandas




Selecionando várias colunas em um dataframe de pandas (10)

é só usar: ele selecionará a coluna bec.

df1=pd.DataFrame()
df1=df[['b','c']]

então você pode apenas chamar df1:

df1

Eu tenho dados em colunas diferentes, mas não sei como extraí-los para salvar em outra variável.

index  a   b   c
1      2   3   4
2      3   4   5

Como faço para selecionar 'a' , 'b' e salvá-lo no df1?

eu tentei

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

Nenhum parece funcionar.


A partir da versão 0.11.0, as colunas podem ser cortadas da maneira que você tentou usando o indexador .loc :

df.loc[:, 'C':'E']

é equivalente a

df[['C', 'D', 'E']]  # or df.loc[:, ['C', 'D', 'E']]

e retorna as colunas C a E

Uma demonstração em um DataFrame gerado aleatoriamente:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

Para obter as colunas de C para E (note que, ao contrário do fatiamento de inteiro, 'E' está incluído nas colunas):

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

O mesmo funciona para selecionar linhas com base em rótulos. Obtenha as linhas "R6" a "R10" nessas colunas:

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc também aceita uma matriz booleana para que você possa selecionar as colunas cuja entrada correspondente na matriz é True . Por exemplo, df.columns.isin(list('BCD')) retorna array([False, True, True, True, False, False], dtype=bool) - Verdadeiro se o nome da coluna estiver na lista ['B', 'C', 'D'] ; Falso, caso contrário.

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...

Abaixo está o meu código:

import pandas as pd
df = pd.read_excel("data.xlsx", sheet_name = 2)
print df
df1 = df[['emp_id','date']]
print df1

Saída:

  emp_id        date  count
0   1001   11/1/2018      3
1   1002   11/1/2018      4
2          11/2/2018      2
3          11/3/2018      4
  emp_id        date
0   1001   11/1/2018
1   1002   11/1/2018
2          11/2/2018
3          11/3/2018

Primeiro dataframe é o mestre. Acabei de copiar duas colunas em df1.


As diferentes abordagens discutidas nas respostas acima baseiam-se na suposição de que o usuário sabe que os índices de coluna devem ser descartados ou que o usuário deseja subconjugar um dataframe usando um intervalo de colunas (por exemplo, entre 'C': 'E') . pandas.DataFrame.drop () é certamente uma opção para subconjuntos de dados com base em uma lista de colunas definidas pelo usuário (embora você tenha que ter cuidado ao usar sempre a cópia do dataframe e os parâmetros inplace não devem ser definidos como True !!)

Outra opção é usar pandas.columns.difference () , que faz uma diferença no conjunto de nomes de colunas, e retorna um tipo de índice de array contendo as colunas desejadas. A seguir está a solução:

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)

A saída seria: bc 1 3 4 2 4 5


Com pandas,

nomes de coluna de sagacidade

dataframe[['column1','column2']]

com iloc, o índice da coluna pode ser usado como

dataframe[:,[1,2]]

com nomes de colunas loc pode ser usado como

dataframe[:,['column1','column2']]

espero que ajude !


Eu achei este método muito útil:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

Mais detalhes podem ser encontrados here


Os nomes das colunas (que são strings) não podem ser fatiados da maneira que você tentou.

Aqui você tem algumas opções. Se você souber a partir do contexto quais variáveis ​​você deseja dividir, você pode simplesmente retornar uma visualização apenas dessas colunas passando uma lista para a sintaxe __getitem__ (as [] 's).

df1 = df[['a','b']]

Como alternativa, se for importante indexá-los numericamente e não pelo nome (digamos que seu código faça isso automaticamente sem saber os nomes das duas primeiras colunas), você poderá fazer isso:

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

Além disso, você deve se familiarizar com a ideia de uma exibição em um objeto Pandas versus uma cópia desse objeto. O primeiro dos métodos acima retornará uma nova cópia na memória do subobjeto desejado (as fatias desejadas).

Às vezes, no entanto, existem convenções de indexação nos Pandas que não fazem isso e, em vez disso, fornecem uma nova variável que se refere apenas ao mesmo bloco de memória que o subobjeto ou fatia no objeto original. Isso acontecerá com o segundo modo de indexação, para que você possa modificá-lo com a função copy() para obter uma cópia regular. Quando isso acontece, alterar o que você acha que é o objeto cortado às vezes pode alterar o objeto original. Sempre bom estar atento a isso.

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df

Se você deseja obter um elemento por índice de linha e nome de coluna, pode fazê-lo como df['b'][0] . É tão simples quanto você pode imaginar.

Ou você pode usar df.ix[0,'b'] , uso misto de índice e rótulo.

Nota: Desde v0.20 ix foi substituído em favor de loc / iloc .


Você poderia fornecer uma lista de colunas a serem eliminadas e retornar o DataFrame apenas com as colunas necessárias usando a função drop() em um DataFrame do Pandas.

Apenas dizendo

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

retornaria um DataFrame apenas com as colunas b e c .

O método drop está documentado here .


você também pode usar o df.pop ()

>>> df = pd.DataFrame([('falcon', 'bird',    389.0),
...                    ('parrot', 'bird',     24.0),
...                    ('lion',   'mammal',   80.5),
...                    ('monkey', 'mammal', np.nan)],
...                   columns=('name', 'class', 'max_speed'))
>>> df
     name   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal 

>>> df.pop('class')
0      bird
1      bird
2    mammal
3    mammal
Name: class, dtype: object

>>> df
     name  max_speed
0  falcon      389.0
1  parrot       24.0
2    lion       80.5
3  monkey        NaN

deixe-me saber se isso ajuda para você, por favor use df.pop (c)





select