Как нарезать в несколько столбцов? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть датафрейм с некоторыми столбцами, и я хочу работать с 3 из них (с некоторыми nan). Для упрощения предположим, что столбцы:

 A       B        C 
2135    87539    5255
213               
9841     126

Первое, что я хочу сделать, - это иметь только первые две цифры в каждой ячейке, но я не знаю, как это сделать, так как тип является плавающим, и у меня есть некоторые пропущенные значения. Я хочу получить это:

 A       B        C 
21       87       52
21               
98       12

Затем я хочу заменить значения nan на '103'. В этой части я сделал так, и это сработало.

df.update(df[['A', 'B', 'C']].fillna(103))

Так что мой окончательный фрейм данных будет таким:

 A       B        C 
21       87       52
21       103      103 
98       12       103

Я просто действительно не знаю, как сделать первую часть где я нарезаю целые числа. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вот что вы можете сделать. Я уверен, что это не идеальное решение, но это смутная идея, и она работает. Может быть, вы можете попытаться немного его оптимизировать.

import pandas as pd
data = [[2135,87539,5255],[213,130,130],[9841,126,130]]
df = pd.DataFrame(data,columns=['A','B','C'], dtype=float)
print df

#Converting to object Dtype
df[["A", "B","C"]] = df[["A","B", "C"]].astype(str) 
print df

#Storing columns in lists
listA = list(df.A)
listB = list(df.B)
listC = list(df.C)

#For generating required data
newListA = []
newListB = []
newListC = []

#Storing required data into new lists
for itemA,itemB,itemC in zip(listA,listB,listC):
    newListA.append(str(itemA[0:2]))
    newListB.append(str(itemB[0:2]))
    newListC.append(str(itemC[0:2]))

#Converting the lists to new Dataframe with float Dtype    
new_df = pd.DataFrame(zip(newListA,newListB,newListC), columns=['A','B','C'], dtype=float)
print(new_df)
0 голосов
/ 28 марта 2020

IIU C, используйте Series.astype, а затем DataFrame.stack для доступа к первым 2 символам.

df.stack().astype(str).str[:2].unstack()

Выход

    A   B   C
0  21  87  52
1  21        
2  98  12    

или используя pd.to_numeric, если вы хотите получить значения с плавающей запятой в конце

pd.to_numeric(df2.stack().astype(str).str[:2], errors='coerce').unstack()
      A     B     C
0  21.0  87.0  52.0
1  21.0   NaN   NaN
2  98.0  12.0   NaN
...