Python: заполнить строку кадра данных pandas столбцом массива numpy - PullRequest
0 голосов
/ 24 марта 2020

У меня есть pandas массив данных (1413 строк) и массив numpy (1412 строк).

type(df1)
Out[193]: pandas.core.frame.DataFrame

df1.shape
Out[194]: (1413, 15)

type(arr1)
Out[195]: numpy.ndarray

arr1.shape
Out[196]: (1412, 3)

Я хотел бы заполнить столбец в df1 столбцом в arr1 + Нэн, но это не работает

df1['aaa'] = np.vstack((np.nan, arr1[:,0]))

Может кто-нибудь дать мне знать, как это сделать?

Ответы [ 5 ]

0 голосов
/ 24 марта 2020

Несмотря на то, что я вижу несколько других ответов, ни один из них действительно не решает проблему под рукой. Интуитивно, ваш подход в порядке; Вы укладываете nan вертикально на массив столбцов.

df1['aaa'] = np.vstack((np.nan, arr1[:,0]))

Это должно работать, но это не так. Небольшая проблема здесь в том, что vstack ищет размерность столбца. arr1[:,0] имеет форму (1412, ); у него нет второго измерения. Простое изменение его до (1412,1) сделает vstack отлично работающим.

df1['aaa'] = np.vstack((np.nan, arr1[:,0].reshape(-1,1)))
0 голосов
/ 24 марта 2020

Вы можете использовать np.append

df1['aaa'] = np.append(np.nan, arr1[:,0])
0 голосов
/ 24 марта 2020

Используйте numpy.hstack для добавления одного значения в массив 1d:

df1 = pd.DataFrame({'a': range(6)})

arr1 = np.arange(15).reshape(5,3)
print (arr1)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

df1['aaa'] = np.hstack((np.nan, arr1[:,0]))
print (df1)
   a   aaa
0  0   NaN
1  1   0.0
2  2   3.0
3  3   6.0
4  4   9.0
5  5  12.0

Другая идея, если возможно, не индекс по умолчанию DataFrame, это использовать Series конструктор с индексированием df1.index:

df1 = pd.DataFrame({'a': range(6)}, index=list('abcdef'))

arr1 = np.arange(15).reshape(5,3)
print (arr1)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

dif = df1.shape[0] - arr1.shape[0]
df1['aaa'] = pd.Series(arr1[:,0], index=df1.index[dif:])
print (df1)
   a   aaa
a  0   NaN
b  1   0.0
c  2   3.0
d  3   6.0
e  4   9.0
f  5  12.0

Последняя позиция:

dif = df1.shape[0] - arr1.shape[0]
df1['aaa'] = pd.Series(arr1[:,0], index=df1.index[:-dif])
print (df1)
   a   aaa
a  0   0.0
b  1   3.0
c  2   6.0
d  3   9.0
e  4  12.0
f  5   NaN

РЕДАКТИРОВАТЬ:

arr1 = np.arange(15).reshape(5,3)
df1 = pd.DataFrame({'a': range(6)})

Если выбрать 0 только получить 1d массив с формой (6,), поэтому необходимо numpy.hstack:

a = np.hstack((np.nan, arr1[:,0]))
print (a)
[nan  0.  3.  6.  9. 12.]

print (a.shape)
(6,)

df1['aaa'] = a

Если выбрать [0], получить 2d массив с размерами MxN с формой (6,1), поэтому возможно использование numpy.vstack:

a1 = np.vstack((np.nan, arr1[:,[0]]))
print (a1)
[[nan]
 [ 0.]
 [ 3.]
 [ 6.]
 [ 9.]
 [12.]]

print (a1.shape)
(6, 1)


df1['aaa1'] = a1
print (df1)
   a   aaa  aaa1
0  0   NaN   NaN
1  1   0.0   0.0
2  2   3.0   3.0
3  3   6.0   6.0
4  4   9.0   9.0
5  5  12.0  12.0   
0 голосов
/ 24 марта 2020

Вы можете сделать это, здесь у вас есть результат. Вы добавляете столбец и первая строка - NaN:

df['aaa'] = pd.Series(ar1[:,0])
ea = np.empty(df.shape[1]).fill(np.nan)
df.loc[-1] = ea
df.index = df.index + 1
df = df.reset_index(drop=True).sort_values(by=['aaa'], na_position='first')

Вот ваш DataFrame:

c1  c2  c3
0   1   2   3
1  10  20  30

Вот массив:

[[  5  55]
 [ 50 550]]

И результат таков:

     c1    c2    c3   aaa
2   NaN   NaN   NaN   NaN
0   1.0   2.0   3.0   5.0
1  10.0  20.0  30.0  50.0
0 голосов
/ 24 марта 2020

Это то, что вы имеете в виду?

df1['aaa'] = pandas.DataFrame(arr1[:, 0])[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...