У меня есть 3 панды данных с ответами на опрос, которые выглядят одинаково, но созданы по-разному:
import pandas as pd
df1 = pd.DataFrame([[1,2,3],[4,5,'hey'],[7,8,9]])
df2 = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]])
df2.loc[1,2] = 'hey'
df3 = pd.DataFrame(index=range(3), columns=range(3))
for i in range(3):
for j in range(3):
if (i,j) != (1,2):
df3.loc[i,j] = i*3 + j + 1
else:
df3.loc[i,j] = 'hey'
# df1, df2, df3 look the same as below
0 1 2
0 1 2 3
1 4 5 hey
2 7 8 9
Теперь, когда я беру суммы по столбцам, они все дают мне одинаковые результаты.
sumcol1 = df1.sum()
sumcol2 = df2.sum()
sumcol3 = df3.sum()
# sumcol1, sumcol2, sumcol3 look the same as below
0 12
1 15
dtype: int64
Однако, когда я беру суммы по строкам, df3
дает другой результат по сравнению с df1
и df2
.
Кроме того, кажется, что при оси = 0 сумма столбца, содержащего строки, вычисляться не будет, тогда как при оси = 1 все суммы строк будут рассчитываться с элементами, принадлежащими столбцу с пропущенными элементами строки.
sumrow1 = df1.sum(axis=1)
sumrow2 = df2.sum(axis=1)
sumrow3 = df3.sum(axis=1)
#sumrow1
0 3
1 9
2 15
dtype: int64
#sumrow2
0 3
1 9
2 15
dtype: int64
#sumrow3
0 0.0
1 0.0
2 0.0
dtype: float64
У меня есть 3 вопроса по этому поводу.
Что вызывает различное поведение между sumcol1
и sumrow1
?
Что вызывает различное поведение между sumrow1
и sumrow3
?
Есть ли правильный способ получить результат, который совпадает с sumrow1
с df3
?
Добавлено:
Есть ли умный способ добавить только числовые значения при сохранении строк?
Мой текущий обходной путь (благодаря любезному ответу jpp):
df = pd.DataFrame([[1,2,3],[4,5,'hey'],[7,8,9]])
df_c = df.copy()
for col in df.select_dtypes(['object']).columns:
df_c[col] = pd.to_numeric(df_c[col], errors='coerce')
df['sum'] = df_c.sum(axis=1)
#result
0 1 2 sum
0 1 2 3 6.0
1 4 5 hey 9.0
2 7 8 9 24.0
Я работаю с Python 3.6.6, панды 0.23.4.