Преобразование pandas df в R data.frame с использованием rpy2 со столбцами смешанного типа

1

Если у меня есть кадр данных Pandas, который содержит столбец со смесью символов и числовых данных, например:

d = {'one' : pd.Series(['cat', 2., 3.], index=['a', 'b', 'c']),
 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} 
df = pd.DataFrame(d)

%%R -i df
str(df)

тогда, когда он преобразуется в R.frame с использованием rpy2, каждое значение в смешанном столбце получает свой собственный столбец в R.frame, заполненный тем же значением. В приведенном выше коде создается data.frame с 5 столбцами, а не 2:

'data.frame':   4 obs. of  5 variables:
 $ one.a: chr  "cat" "cat" "cat" "cat"
 $ one.b: num  2 2 2 2
 $ one.c: num  3 3 3 3
 $ one.d: num  NaN NaN NaN NaN
 $ two  : num  1 2 3 4

Это ожидаемое поведение? Если да, то почему?

(Я использую Jupyter ноутбук 5.0.0, работающий на Python 3.5.4 | Anaconda custom (64-bit) | Windows 10 и rpy2 2.9.1)

Благодарю.

  • 0
    Подумайте об использовании последней версии rpy2. Были исправления о преобразовании панд, особенно в rpy2-2.9.2 (см. Rpy2.github.io/doc/latest/html/changes.html )
  • 0
    Спасибо @lgautier. Сейчас я обновил rpy2 до 2.9.4 (самое последнее колесо, которое я смог найти), но я все еще вижу ту же проблему.
Теги:
pandas
rpy2

1 ответ

0

Похоже, rpy2 делает r listvector не r stringvector. Я столкнулся с аналогичной проблемой при преобразовании кадра данных. В некоторых столбцах были строки и NaN. Хотя я использовал pandas2ri.py2ri() вместо R magic, я думаю, что они похожи.

Этот код, похоже, работает.

# Your code with pandas2ri instead of rmagic
d = {'one' : pandas.Series(['cat', 2., 3.], index=['a', 'b', 'c']),
     'two' : pandas.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} 
df = pandas.DataFrame(d)

print(df)

pandas2ri.activate()
r_df = pandas2ri.py2ri(df)
print(r_df)

# convert each column individually to see the vector type in R
r_df1 = pandas2ri.py2ri(df['one'])
print(type(r_df1))

r_df2 = pandas2ri.py2ri(df['two'])
print(type(r_df2))

# Make an rpy2 OrdDict, be sure to include the None to avoid indexing problems
od = rlc.OrdDict([('one', robjects.StrVector(['cat', 2., 3., None])),
                  ('two', robjects.FloatVector([1., 2., 3., 4.]))])

# make a vector for rownames
od_rownames = robjects.StrVector(['a', 'b', 'c', 'd'])

# convert the OrdDict to an r dataframe and assign rownames
od_df = robjects.DataFrame(od)
print(od_df)

od_df.rownames = od_rownames
print(od_df)

Дополнительная информация доступна https://rpy2.github.io/doc/v2.9.x/html/vector.html#creating-objects

Ещё вопросы

Сообщество Overcoder
Наверх
Меню