Почему все элементы все NaN, когда строят мультииндексный Dataframe - PullRequest
0 голосов
/ 08 мая 2018

Предположим, у меня есть такой Dataframe. Я хочу преобразовать это в двухуровневый мультииндексный Dataframe.

         dt         st  close  volume
0   20100101  000001.sz      1   10000
1   20100101  000002.sz     10   50000
2   20100101  000003.sz      5    1000
3   20100101  000004.sz     15    7000
4   20100101  000005.sz    100  100000
5   20100102  000001.sz      2   20000
6   20100102  000002.sz     20   60000
7   20100102  000003.sz      6    2000
8   20100102  000004.sz     20    8000
9   20100102  000005.sz    110  110000

Но когда я попробую этот код:

data = pd.read_csv('data/trial.csv')
print(data)
idx = pd.MultiIndex.from_product([data.dt.unique(),
                                  data.st.unique()],
                                 names=['dt', 'st'])
col = ['close', 'volume']

df = pd.DataFrame(data, idx, col)
print(df)

Я считаю, что все элементы NaN

                    close  volume
dt       st                      
20100101 000001.sz    NaN     NaN
         000002.sz    NaN     NaN
         000003.sz    NaN     NaN
         000004.sz    NaN     NaN
         000005.sz    NaN     NaN
20100102 000001.sz    NaN     NaN
         000002.sz    NaN     NaN
         000003.sz    NaN     NaN
         000004.sz    NaN     NaN
         000005.sz    NaN     NaN

Как справиться с этой ситуацией? Благодаря.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вам нужен только параметр index_col в read_csv:

#by positions of columns
data = pd.read_csv('data/trial.csv', index_col=[0,1])

Или:

#by names of columns
data = pd.read_csv('data/trial.csv', index_col=['dt', 'st'])

print (data)
                    close  volume
dt       st                      
20100101 000001.sz      1   10000
         000002.sz     10   50000
         000003.sz      5    1000
         000004.sz     15    7000
         000005.sz    100  100000
20100102 000001.sz      2   20000
         000002.sz     20   60000
         000003.sz      6    2000
         000004.sz     20    8000
         000005.sz    110  110000

Почему все элементы имеют значение NaN, когда создаются мультииндексные Dataframe?

Причина в конструкторе DataFrame:

df = pd.DataFrame(data, idx, col)

DataFrame называется data имеет RangeIndex и не совпадает с новым MultiIndex, поэтому получите NaN s в данных.

Возможным решением, если всегда каждый dt имеет одинаковые значения st, является фильтр Dataframe по именам столбцов и затем преобразуется в numpy array, но лучше решения index_col и set_index:

df = pd.DataFrame(data[col].values, idx, col)
0 голосов
/ 08 мая 2018

Попробуйте использовать set_index() вот так:

new_df = df.set_index(['dt', 'st'])

Результат:

>>> new_df

                    close  volume
dt       st                      
20100101 000001.sz      1   10000
         000002.sz     10   50000
         000003.sz      5    1000
         000004.sz     15    7000
         000005.sz    100  100000
20100102 000001.sz      2   20000
         000002.sz     20   60000
         000003.sz      6    2000
         000004.sz     20    8000
         000005.sz    110  110000

>>> new_df.index
MultiIndex(levels=[[20100101, 20100102], ['000001.sz', '000002.sz', '000003.sz', '000004.sz', '000005.sz']],
           labels=[[0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]],
           names=['dt', 'st'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...