Создать столбец с одинаковым значением кортежа для всех строк - PullRequest
0 голосов
/ 07 ноября 2018

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

df = pd.DataFrame(index=range(10))
df['foo']=9      #ok
df['bar']=(10,12) #think's I'm passing in a too-short column

ValueError: длина значений не соответствует длине индекса

Как мне установить все строки столбца 'bar' в кортеж?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Или вы можете сделать:

...
df['bar']='10,12'
df['bar']=df['bar'].str.split(',')

Тогда:

print(df)

Является:

   foo       bar
0    9  [10, 12]
1    9  [10, 12]
2    9  [10, 12]
3    9  [10, 12]
4    9  [10, 12]
5    9  [10, 12]
6    9  [10, 12]
7    9  [10, 12]
8    9  [10, 12]
9    9  [10, 12]

Если хотите кортеж, выполните:

...
df['bar']='10,12'
df['bar']=df['bar'].str.split(',').map(tuple)

Теперь:

print(df)

Является:

   foo       bar
0    9  (10, 12)
1    9  (10, 12)
2    9  (10, 12)
3    9  (10, 12)
4    9  (10, 12)
5    9  (10, 12)
6    9  (10, 12)
7    9  (10, 12)
8    9  (10, 12)
9    9  (10, 12)
0 голосов
/ 07 ноября 2018

Вы можете использовать конструктор DataFrame:

df = pd.DataFrame({'foo': 9, 'bar':[(10,12)]}, index=range(10))

Или используйте понимание списка или повторяйте кортежи длиной DataFrame:

df = pd.DataFrame(index=range(10))
df['foo']=9      #ok
df['bar']= [(10,12) for _ in df.index]
#another solution
#df['bar']= [(10,12)] * len(df)

print (df)
   foo       bar
0    9  (10, 12)
1    9  (10, 12)
2    9  (10, 12)
3    9  (10, 12)
4    9  (10, 12)
5    9  (10, 12)
6    9  (10, 12)
7    9  (10, 12)
8    9  (10, 12)
9    9  (10, 12)

Performance

df = pd.DataFrame(index=range(1000))

In [99]: %%timeit
    ...: df['bar']='10,12'
    ...: df['bar']=df['bar'].str.split(',').astype(tuple)
    ...: 
977 µs ± 37.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [100]: %%timeit
     ...: df['bar']= [(10,12) for _ in df.index]
     ...: 
218 µs ± 3.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [101]: %%timeit
     ...: df['bar']= [(10,12)] * len(df)
     ...: 
175 µs ± 8.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [105]: %%timeit
     ...: df = pd.DataFrame({'foo': 9, 'bar':[(10,12)]}, index=range(1000))
     ...: 
400 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [106]: %%timeit
     ...: df = pd.DataFrame(index=range(1000))
     ...: df['foo']=9
     ...: df['bar']= [(10,12)] * len(df)
     ...: 
766 µs ± 5.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...