如何在不改变列的情况下将数据框中所有行的值连接成一行?

时间:2018-03-17 23:00:33

标签: python pandas dataframe

我有一个数据框输入,如下所示:

  col1 col2 col3
0    3    1  NaN
1  NaN    7    8

如何在使用', '连接行中的数据时折叠所有行?

所需的数据帧输出:

  col1  col2 col3
0    3  1, 7    8

示例输入代码:

import pandas as pd
import numpy as np


d = {'col1': ["3", np.nan], 'col2': ["1", "7"], 'col3': [np.nan, "8"]}
df = pd.DataFrame(data=d)

5 个答案:

答案 0 :(得分:6)

想到

dropna + str.join + df.agg(lambda x: ', '.join(x.dropna())).to_frame().T col1 col2 col3 0 3 1, 7 8

  FileInputStream serviceAccount = new 
  FileInputStream("path/to/serviceAccountKey.json");
  FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .setDatabaseUrl("https://qrmoney-1aec0.firebaseio.com")
    .build();
  FirebaseApp.initializeApp(options);

还有其他解决方案,我的同行会为您找到它们:)

答案 1 :(得分:5)

pd.DataFrame(
    [[
        ', '.join(map(str, map(int, filter(pd.notna, c))))
        for c in zip(*df.values)
    ]], columns=df.columns
)

  col1  col2 col3
0    3  1, 7    8

答案 2 :(得分:4)

获得所需内容的一种方法是创建一个与旧数据帧具有相同列的新数据框,并使用所需数据填充第一个索引。在您的情况下,您所需的数据将是每列的列表,由', '加入,并删除您的NaN值:

new_df = pd.DataFrame(columns=df.columns)

for col in df.columns:
    new_df.loc[0, col] = ', '.join(df[col].dropna().tolist())

>>> new_df
  col1  col2 col3
0    3  1, 7    8

答案 3 :(得分:4)

使用堆栈

df.stack().groupby(level=1).apply(','.join).to_frame().T
Out[163]: 
  col1 col2 col3
0    3  1,7    8

答案 4 :(得分:3)

还有一个选择:

In [156]: pd.DataFrame([[df[c].dropna().astype(int).astype(str).str.cat(sep=', ') 
                         for c in df]], 
                       columns=df.columns)
Out[156]:
  col1  col2 col3
0    3  1, 7    8