2014-12-16 4 views
3

У меня есть две серии, которые индексируются в том же формате. Вот клипы двух ниже (из-за размера данных я не буду показывать весь набор):Создание базы данных pandas из индексов серии изменений

>>> s1 
Out[52]: 
parameter_id parameter_type_cs_id 
4959   1      -0.2664122 
4960   1      -0.004289398 
4961   1      -0.006652875 
4966   1      -0.004208685 
4967   1      -0.02268688 
4968   1      -0.05958452 
4969   1      -0.01133198 
4970   1      -0.01968251 
4972   1      -0.05860331 
4974   1      -0.08260008 
4975   1      -0.05402012 
4979   1      -0.0308407 
4980   1      -0.02232495 
4987   1      -0.2315813 
4990   1      -0.02171027 
... 
727241  1       -0.00156766 
727242  1       -0.0009964491 
727243  1       -0.007068732 
727244  1       -0.003500738 
727245  1       -0.006572505 
727246  1       -0.0005814131 
728060  1        -0.0144799 
728062  1        -0.0418521 
728063  1       -0.01367948 
728065  1       -0.03625054 
728066  1       -0.06806824 
728068  1       -0.007910916 
728071  1       -0.005482052 
728073  1       -0.005845178 
intercept        [-11.4551819018] 
Name: coef, Length: 1529, dtype: object 

>>> s2 
Out[53]: 
parameter_id parameter_type_cs_id 
4958   1      -0.001683882 
4959   1       -1.009859 
4960   1      -0.0004456379 
4961   1      -0.005564386 
4963   1       -0.9145955 
4964   1      -0.0009077246 
4965   1      -0.0003179153 
4966   1      -0.0006907124 
4967   1      -0.02125838 
4968   1      -0.02443978 
4969   1      -0.002665334 
4970   1      -0.003135213 
4971   1      -0.0003539563 
4972   1      -0.03684852 
4973   1      -0.0001203596 
... 
728044  1       -0.0003084855 
728060  1        -0.925618 
728061  1       -0.001192743 
728062  1        -0.9203911 
728063  1       -0.002522615 
728064  1       -0.0003572484 
728065  1       -0.003475959 
728066  1       -0.02329697 
728068  1       -0.001412785 
728069  1       -0.002095895 
728070  1       -9.790675e-05 
728071  1       -0.0003013977 
728072  1       -0.0003369116 
728073  1       -0.000249748 
intercept        [-12.1281459287] 
Name: coef, Length: 1898, dtype: object 

Форматы индекса одинаковы, и поэтому я стараюсь, чтобы поместить их в dataframe как так :

d = {'s1': s1, 's2': s2} 
df = pd.DataFrame(d) 

Однако я заметил, что выход есть почти все NaN, которые я нахожу шокирующим. Я посмотрел на индексах для отдельных серий и заметил, что dataframe было их как строки, а не в том же формате, что и серии

>>> s1.index.values 
Out[54]: 
array([(4959, 1), (4960, 1), (4961, 1), ..., (728071, 1), (728073, 1), 
     ('intercept', '')], dtype=object) 

>>> s2.index.values 
Out[55]: 
array([(4958, 1), (4959, 1), (4960, 1), ..., (728072, 1), (728073, 1), 
     ('intercept', '')], dtype=object) 

Но dataframe имеет строки

>>> df.index.values 
Out[56]: 
array([('4959', '1'), ('4960', '1'), ('4961', '1'), ..., ('8666', '1'), 
     ('9638', '1'), ('intercept', '')], dtype=object) 

Почему изменяя типа и является причиной моей проблемы ...?

Еще более странно для меня, если бы я попробовать то же самое, что и выше на меньшем наборе я вижу поведение я бы ожидать (не все NaN и индексы не конвертируются)

s1_ = s1[:15] 
s2_ = s2[:15] 
d_ = {'s1': s1_, 's2': s2_} 
df_ = pd.DataFrame(d_) #<---- This has the behavior I would expect 

EDIT я нашел способ, который работает, но я не знаю, почему это работает так, если преобразовать обе серии в dataframes затем присоединиться к ним он работает, как ожидалось:

df_1 = pd.DataFrame({'s1': s1}) 
df_2 = pd.DataFrame({'s2': s2}) 
new_df = df_1.join(df_2) #WHY DOES THIS WAY WORK!?!? 
+0

Вы можете попробовать: 'pd.concat ([s1, s2], axis = 1, keys = [" s1 "," s2 "])' – HYRY

+0

@HYRY Я получаю тот же результат, к сожалению ... все значения NaN и индексы строк – sedavidw

+0

Мне кажется, что ваши данные имеют 3 (4959, 1, -1,009859) значения и два столбца заголовка (parameter_id parameter_type_cs_id). Это ваше намерение. Причина, по которой вы видите индекс в виде массива, вероятно, из-за этого несоответствия – nitin

ответ

2

Причина, по которой он является преобразованием индексов в строки, потому что последний индекс

intercept        [-11.4551819018] 

в вашей данной серии является строкой. В документации для кадров данных Pandas указано, что при построении кадра данных из серии фрейм данных сохраняет ту же самую индексацию из серии, которая вызывает преобразование ко всем строкам из-за последней строки в данных.

Ваше решение для создания двух фреймов данных и их присоединения работает, потому что индексирование является последовательным, поскольку вы используете одну и ту же структуру данных (например, кадр данных) вместо того, чтобы преобразовывать из одной структуры данных (серии) в другую (кадр данных). Кажется, это особенность Панды. Я бы придерживался вашего решения.

3

Я не ваш dataframe, бушель t вот пример с небольшими данными, чтобы показать, что панды проектируют фрейм данных как и ожидалось (используя pandas 0.15.1 и python 3.4). Как и ожидалось, NaN вводятся, когда индексы не совпадают.

Последняя строка ваших данных ('intercept', ''), а все остальные строки - это числа. Таким образом ('перехват', '') идет к индексу каждой серии, и это, вероятно, приводит к тому, что значения в индексе будут «продвигаться» к строкам.

>> s1 = pd.Series([1,2,3], index=pd.MultiIndex.from_tuples([(1,1),(1,2),(1,3)], names=['a','b'])) 
>>> s1 
a b 
1 1 1 
    2 2 
    3 3 
dtype: int64 
>>> s2 = pd.Series([100,200,300], index=pd.MultiIndex.from_tuples([(1,2),(1,3),(1,4)], names=['a','b'])) 
>>> 
>>> s2 
a b 
1 2 100 
    3 200 
    4 300 
dtype: int64 
>>> df = pd.DataFrame({'s1':s1, 's2':s2}) 
>>> df 
    s1 s2 
a b   
1 1 1 NaN 
    2 2 100 
    3 3 200 
    4 NaN 300 
>>> df.index.values 
array([(1, 1), (1, 2), (1, 3), (1, 4)], dtype=object) 
+0

Кажется, что все работает отлично, как 0.11! –

Смежные вопросы