Pracuję z dużym plikiem csv (> 500 000 kolumn x 4033 wiersze) i moim celem jest uzyskanie sumy wszystkich liczb w wierszu, z wyjątkiem trzech pierwszych komórek pierwszego wiersza, które są tylko opisowe próbki. Chciałbym skorzystać z pakietu pandy.
Zbiór danych wygląda mniej więcej tak:
label Group numOtus Otu0000001 Otu0000002 Otu0000003 Otu0000004 ... Otu0518246 sum
00.03 1.118234 518246 0 62 275 0 ... 5 ?
Próbowałem kilku różnych rzeczy, ale żadna z nich nie działała.
Nie mogę po prostu użyć read_csv z pand, a następnie z nim pracować, ponieważ plik jest zbyt duży (4 GB). Więc spróbowałem pętli for, otwierając po jednym wierszu na raz, ale nie otrzymuję tego, czego się spodziewałem. Ostateczne dane wyjściowe powinny być kolumną z sumą w wierszu. Jakieś pomysły?
lst = []
for line in range(4033):
l = pd.read_csv("doc.csv", sep = "\t", nrows=1, low_memory=false)
l = l.drop(columns=['label', 'Group', "numOtus"])
x = l[list(l.columns)].sum(axis=1, numeric_only=float)
lst.append(x)
3 odpowiedzi
Możesz użyć dask
, który jest specjalnie do tego stworzony.
import dask.dataframe as dd
dd.read_csv("doc.csv", sep = "\t").sum().compute()
sample
w wywołaniu do read_csv
/read_table
sample
, np. dzwonisz z sample=1e9
?
sample=10**9
Innym rozwiązaniem poza dask jest użycie parametru chunksize
w pd.read_csv
, a następnie pd.concat
swoich porcji. Szybki przykład:
chunksize = 1000
l = pd.read_csv('doc.csv', chunksize=chunksize, iterator=True)
df = pd.concat(l, ignore_index=True)
Dodatek: Aby zrobić coś z kawałkami jeden po drugim, możesz użyć:
chunksize = 1000
for chunk in pd.read_csv('doc.csv', chunksize=chunksize, iterator=True):
# do something with individual chucks there
Aby zobaczyć postęp, możesz rozważyć użycie tqdm.
from tqdm import tqdm
chunksize = 1000
for chunk in tqdm(pd.read_csv('doc.csv', chunksize=chunksize, iterator=True)):
# do something with individual chucks there
%timeit
nie służy do przewidywania, które uruchomi funkcję wiele razy. Jak widzę w twoim pytaniu, problem polega na tym, że parametr chucksize
określa liczbę wierszy na porcję. Prawdziwym wąskim gardłem jest to, że masz ponad 500 tys. kolumn i tylko 4033 wierszy. Spróbuj zmniejszyć wielkość kawałka do około 500 - 1000 lub nawet mniej.
Możesz używać pandas.Series.append
i pandas.DataFrame.sum
wraz z pandas.DataFrame.iloc
, podczas czytania danych w kawałkach,
row_sum = pd.Series([])
for chunk in pd.read_csv('doc.csv',sep = "\t" ,chunksize=50000):
row_sum = row_sum.append(chunk.iloc[:,3:].sum(axis = 1, skipna = True))
i=0
for chunk in pd.read_csv('doc.csv',sep = "\t" ,chunksize=50000):
print(i)
i+=1
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.