2016-04-13 7 views
2

Wie kann ich eine Tab-Datei, mit leeren Spalten-Headern, in einen Datenrahmen verwandeln? Genauer gesagt, wie kann ich diesen Datenrahmen nur mit Werten füllen, die einem Buchstaben in der benachbarten unmarkierten Spalte entsprechen, in diesem Fall 'P'?Tab-Dateien in Pandas Datenrahmen nach Spalten mit fehlenden Kopfzeilen

Dies ist eine Darstellung der Tab-Datei, die ich verwende. Beachten Sie das Fehlen von Kopfzeilen über den Spalten A oder P.

gene cell_1  cell_2 
MYC 5.0  P 4.0  A 
AKT 3.0  A 1.0  P 

Der gewünschte Datenrahmen würde wie folgt aussehen:

gene cell_1 cell_2 
MYC 5.0  NaN 
AKT NaN  1.0 

Was ist der beste Weg, um dieses Problem mit Pandas zu bewältigen?

Antwort

1

Ich hat versucht, ein paar verschiedenen Ansätze zur Umsetzung das zeigen ausgefallene Indizierungs- und Maskierungsmethoden. Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben

#Load Data 
string_data = "gene cell_1 cell_2 \nMYC 5.0 P 4.0 A\nAKT 3.0 A 1.0 P" 
A_pre = np.array([row.split(" ") for row in string_data.split("\n")]) 
DF_data = pd.DataFrame(A_pre[1:,1:], 
         index=pd.Series(A_pre[1:,0],name=A_pre[0,0]), 
         columns=A_pre[0,1:]) 

A_data = DF_data.as_matrix() #Set the data array b/c it's quicker to slice than DF 
rowLabels, colLabels = DF_data.index, DF_data.columns 

# #Get blank columns 
gene_idx = np.where(np.array(colLabels) != "")[0] #Used later 
numColBlank = len(colLabels) - len(gene_idx) 

# #Placeholder to fill 
DF_placeholder = pd.DataFrame(np.zeros((DF_data.shape[0],DF_data.shape[1] - numColBlank)), 
           index = DF_data.index, 
           columns = DF_data.columns[gene_idx] 
          ) 
DF_data 

#Populate matrix 
query = "P" 
for i in range(DF_data.shape[0]): 
    for j in range(DF_data.shape[1]): 
     if colLabels[j] == "": 
      if A_data[i,j] == query: 
       cell = colLabels[j-1] 
       gene = rowLabels[i] 
       metric = A_data[i,j-1] 
       DF_placeholder.loc[gene,cell] = metric 

#I just found out about masks they are useful 
mask = DF_placeholder == 0.0 
DF_placeholder[mask] = np.nan 
DF_processed = DF_placeholder 
DF_processed 

enter image description here

1

Für Ihre Beispieldaten pandas ‚s read_fwf() Funktion (für‚feste Breite Format‘) macht einen guten Job zu raten, die Spalten:

s = """gene cell_1  cell_2 
MYC 5.0  P 4.0  A 
AKT 3.0  A 1.0  P""" 

import pandas as pd 
from io import StringIO 
in_file = StringIO(s) 

pd.read_fwf(in_file) 
Out[6]: 
    gene cell_1 Unnamed: 2 cell_2 Unnamed: 4 
0 MYC  5.0   P  4.0   A 
1 AKT  3.0   A  1.0   P 
+0

Dies ist ein guter Start! Wenn ich dann den gewünschten DF erstellen möchte, wie kann ich nur die benachbarten "P" -Werte beibehalten und die "A" -Werte in Nan umwandeln? Dieser Teil ist immer noch verwirrend ... –

1
# Read the dataframe. 
filename = '...' 
df = pd.read_csv(filename, skiprows=1, header=None, sep=" ", skipinitialspace=True) 
df = df.rename(columns={0: 'gene', 1: 'cell_1', 2:'a_p', 3: 'cell_2', 4: 'p_a'}) 

# Changes adjacent 'A' values to NaN. 
df.loc[df.a_p == 'P', 'cell_2'] = None 
df.loc[df.p_a == 'P', 'cell_1'] = None 

>>> df[['gene', 'cell_1', 'cell_2']] 
    gene cell_1 cell_2 
0 MYC  5  NaN 
1 AKT  NaN  1 
Verwandte Themen