Pandas: TypeError: индексы списка должны быть целыми числами или слайсами, а не DataFrame - PullRequest
0 голосов
/ 16 октября 2019

Я работаю с большим количеством входных CSV-файлов в указанной папке. Я использую фрейм данных pandas для хранения входного файла и намереваюсь сделать больше математики.

import numpy as np
import matplotlib.pyplot as plt
import csv
import os
from scipy.interpolate import interp1d
import pandas as pd
import glob

user_info=[19,20,21,22,23] #number of charge states analyzed using fit.py 


path = r'C:\Users\my_folder' # use your path
all_files = glob.glob(path + "/*.csv")

data = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    data.append(df)

my_x=data[0].iloc[2:,0] #assuming that all the files have the same list of x for all data(1~200)

my_y=[]
for filenumber in range(len(all_files)):
    my_y.append(data[filenumber].iloc[2:,1:len(user_info)+1])

В этом примере проанализированы все файлы - два файла csv.

In[469]: all_files
Out[469]: 
['C:\\Users\my_folder\my_csv_file_001.csv',
 'C:\\Users\my_folder\my_csv_file_002.csv']

'Данные »представляет собой список из 2 элементов. Каждый элемент содержит информацию из каждого CSV-файла. Каждый элемент читается как DataFrame.

In [471]:data[0]
Out[471]: 
[      -2   8125     7350    6725
 0     -1   8550     7700    7025
 1      0      0       51       0
 2      1      0       20       0
 3      2      0       57       0
 4      3      0      196       0
 5      4      0       92       0
 6      5      0       91      62
 7      6      0       52      85
 8      7      0        0       0
 9      8      0      201       0
 10     9      0       36       0
 11    10      0      104      14
 12    11      0       96       0
 13    12     89        0       0
 14    13     20       94       0
 15    14    149      120       0
 16    15      0       54      41
 17    16     18        0      29
 18    17      0       61      59
 19    18    168      285    1375
 20    19    575    22737   94126
 21    20   5198   520564  364946
 22    21  18037  1649117  594484
 23    22  51229  2189268  198710
 24    23  45691  1242980   28893
 25    24  11040   207948    3771
 26    25   1843    27105    1077
 27    26    239     9262     863
 28    27    233     5533     357
 29    28     91     3159     120
 ..   ...    ...      ...     ...
 171  170      0      117      47
 172  171      0       48       0
 173  172      0      186       0
 174  173      0       58       0
 175  174      0       26       0
 176  175      0        0       0
 177  176      0        0       0
 178  177      0        0       0
 179  178      0        0      32
 180  179      0      103       0
 181  180      0       64       0
 182  181      0       39      82
 183  182      0       17       0
 184  183      0       45      58
 185  184      0        0       0
 186  185      0        0       0
 187  186      0       45       0
 188  187      0        0       0
 189  188      0       18       0
 190  189      0        0       0
 191  190      0       89       0
 192  191      0      139       0
 193  192      0       38      28
 194  193      0      110       0
 195  194      0      119       0
 196  195      0        0      83
 197  196      0       28     123
 198  197      0        0      56
 199  198      0       44       0
 200  199      0       84       0

 [201 rows x 4 columns]]

Значения my_y - это все столбцы, кроме первых.

In [476]: my_y[0]
Out[476]: 
[      8125     7350    6725
 2        0       20       0
 3        0       57       0
 4        0      196       0
 5        0       92       0
 6        0       91      62
 7        0       52      85
 8        0        0       0
 9        0      201       0
 10       0       36       0
 11       0      104      14
 12       0       96       0
 13      89        0       0
 14      20       94       0
 15     149      120       0
 16       0       54      41
 17      18        0      29
 18       0       61      59
 19     168      285    1375
 20     575    22737   94126
 21    5198   520564  364946
 22   18037  1649117  594484
 23   51229  2189268  198710
 24   45691  1242980   28893
 25   11040   207948    3771
 26    1843    27105    1077
 27     239     9262     863
 28     233     5533     357
 29      91     3159     120
 30      29     1637       0
 31      64      403      48
 ..     ...      ...     ...
 171      0      117      47
 172      0       48       0
 173      0      186       0
 174      0       58       0
 175      0       26       0
 176      0        0       0
 177      0        0       0
 178      0        0       0
 179      0        0      32
 180      0      103       0
 181      0       64       0
 182      0       39      82
 183      0       17       0
 184      0       45      58
 185      0        0       0
 186      0        0       0
 187      0       45       0
 188      0        0       0
 189      0       18       0
 190      0        0       0
 191      0       89       0
 192      0      139       0
 193      0       38      28
 194      0      110       0
 195      0      119       0
 196      0        0      83
 197      0       28     123
 198      0        0      56
 199      0       44       0
 200      0       84       0

 [199 rows x 3 columns]]

Я хочу извлечь каждый столбец и выполнить некоторые математические операции (np.cumsum). Но я не знаю, как получить доступ к отдельным столбцам в DataFrame в my_y (список). Например, я хочу получить первый столбец y:

0
0
0
0
0
0
0
0
0
0
0
89
20
149
0
18
0
168
575
5198
18037
51229
45691
11040
1843
239
233
91
29
64
0
51
0
0
0
0
0
0
0
38
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
33
0
0
0
0
0
0
18
0
0
0
38
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
32
0
0
0
0
0
0
0
0
0
0
0
0
13
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
18
0
0
0
0
0
0
51
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

Но, как показано выше, my_y [0] выбирает все значения y в первом кадре данных.

Есть идеи?

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете объединить все свои CSV в одном кадре данных. Это будет легче манипулировать. Предполагается, что все CSV имеют столбцы в той же позиции, что и у вас нет заголовка. Я вижу, что вы пропускаете первые строки при выборе х и у, вы также можете использовать параметр skiprows pd.read_csv.

import pandas as pd
import glob

user_info=[19,20,21,22,23] #number of charge states analyzed using fit.py 


path = r'C:\Users\my_folder' # use your path
all_files = glob.glob(path + "/*.csv")

data = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0, skiprows=2)
    data.append(df)

dataframe = pd.concat(data, axis='columns') # this assumes that x are the same and you only add columns in the different csv
my_x = dataframe.iloc[:, 0]
my_y = dataframe.iloc[:, 1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...