Поскольку индексы одинаковы для s и t, почему t возвращает NaN в качестве первого значения? - PullRequest
0 голосов
/ 24 марта 2020

1-е значение - NaN для серии t, но не для s. Почему это так, хотя у ряда есть те же самые индексы.

import numpy as np
import pandas as pd
s = pd.Series([1,2,3,4,5,6],index= [1,2,3,4,5,6])
t = pd.Series([2,4,6,8,10,12],index= [1,2,3,4,5,6])
df = pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"])
df["MUL2"] =t

df


Output:

  MUL1     MUL2
0  1        NaN
1  2        2.0
2  3        4.0
3  4        6.0
4  5        8.0
5  6        10.0

1 Ответ

1 голос
/ 24 марта 2020

Если назначить Series с другими значениями индекса, генерируются пропущенные значения, как в первой строке. Для правильного присвоения нужны одинаковые значения в Series и в DataFrame.

Проблема в том, np.c_ вернуть 2d массив без значений индекса:

print (np.c_[s,t])
[[ 1  2]
 [ 2  4]
 [ 3  6]
 [ 4  8]
 [ 5 10]
 [ 6 12]]

Так что если использовать DataFrame конструктор создается по умолчанию Range_Index, начиная с 0:

df = pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"])
print (df)
   MUL1  MUL2
0     1     2 <- first 0 index
1     2     4
2     3     6
3     4     8
4     5    10
5     6    12

print (s)
1    1 <- first 1 index
2    2
3    3
4    4
5    5
6    6
dtype: int64

print (t)
1     2 <- first 1 index
2     4
3     6
4     8
5    10
6    12
dtype: int64

Если изменить конструктор DataFrame, например, по словарю:

df = pd.DataFrame({"MUL1":s, "MUL2":t})
print (df)
   MUL1  MUL2
1     1     2 <- first 1 index
2     2     4
3     3     6
4     4     8
5     5    10
6     6    12

Или добавить параметр index к DataFrame конструктор по s или t Series:

df = pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"], index=t.index)
print (df)
   MUL1  MUL2
1     1     2
2     2     4
3     3     6
4     4     8
5     5    10
6     6    12

Так что если присвоить t, например, для нового столбца все работает правильно, потому что одинаковые индексы в df и в t:

df["MUL3"] =t
print (df)
   MUL1  MUL2  MUL3
1     1     2     2
2     2     4     4
3     3     6     6
4     4     8     8
5     5    10    10
6     6    12    12
...