Упорядочить значения строк по нескольким столбцам в пандах - PullRequest
0 голосов
/ 10 октября 2018

У меня есть 3 кадра данных панд, каждый из которых содержит 1 столбец.

df1 = pd.DataFrame({'col1':[111, 222, 333, 444, 555]})
df2 = pd.DataFrame({'col2':[222, 333, 555]})
df3 = pd.DataFrame({'col3':[111, 222, 333, 666]})

Я знаю, как объединить их по столбцам:

pd.concat([df1, df2, df3], axis=1)

col1   col2   col3
111    222    111
222    333    222
333    555    333
444    NaN    666
555    NaN    NaN

То, что я хочу, это то, что первыйстрока всех столбцов должна иметь значение 111, если 111 недоступно, это будет NaN, и это относится к последующим строкам.

Я бы хотел отсортировать числа так, чтобы в конечном результатеэто так:

col1   col2   col3
111    NaN    111
222    222    222
333    333    333
444    NaN    NaN
555    555    NaN
NaN    NaN    666

Возможно ли это в пандах?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы можете попробовать объединить кадры данных в первом столбце

df= f1
for f in [df2,df3]:
    df = df.merge(f,left_on=df.columns[0],right_on=f.columns[0],how='outer')

Out:

    col1    col2    col3
0   111.0   NaN     111.0
1   222.0   222.0   222.0
2   333.0   333.0   333.0
3   444.0   NaN      NaN
4   555.0   555.0    NaN
5   NaN     NaN    666.0
0 голосов
/ 10 октября 2018

Да, это возможно, используйте set_index с параметром drop=False для индекса из столбца:

df1 = pd.DataFrame({'col1':[111, 222, 333, 444, 555]})
df2 = pd.DataFrame({'col2':[222, 333, 555]})
df3 = pd.DataFrame({'col3':[111, 222, 333, 666]})

df11 = df1.set_index('col1', drop=False)
df22 = df2.set_index('col2', drop=False)
df33 = df3.set_index('col3', drop=False)

dfs1 = [df11, df22, df33]
df = pd.concat(dfs1, axis=1)
print (df)

      col1   col2   col3
111  111.0    NaN  111.0
222  222.0  222.0  222.0
333  333.0  333.0  333.0
444  444.0    NaN    NaN
555  555.0  555.0    NaN
666    NaN    NaN  666.0

df = pd.concat(dfs1, axis=1).reset_index(drop=True)
print (df)

    col1   col2   col3
0  111.0    NaN  111.0
1  222.0  222.0  222.0
2  333.0  333.0  333.0
3  444.0    NaN    NaN
4  555.0  555.0    NaN
5    NaN    NaN  666.0

Если хотите объединить по первому столбцу:

L = [x.set_index(x.columns[0], drop=False) for x in dfs]
df = pd.concat(L, axis=1).reset_index(drop=True)
print (df)

    col1   col2   col3
0  111.0    NaN  111.0
1  222.0  222.0  222.0
2  333.0  333.0  333.0
3  444.0    NaN    NaN
4  555.0  555.0    NaN
5    NaN    NaN  666.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...