从pandas列和行数据创建字符串

时间:2018-06-18 18:59:19

标签: python pandas

我有兴趣生成一个由pandas行和列数据组成的字符串。鉴于以下pandas数据框,我只对从具有正值的列生成字符串感兴趣

index    A    B    C
  1      0    1    2
  2      0    0    3
  3      0    0    0
  4      1    0    0

我想创建一个新列,该列附加一个字符串,列出一行中哪些列是正数。然后我会丢弃数据来自的所有行:

index    Positives
  1       B-1, C-2
  2       C-3
  4       A-1

2 个答案:

答案 0 :(得分:1)

以下是使用pd.DataFrame.apply + pd.Series.apply的一种方式:

df = pd.DataFrame([[1, 0, 1, 2], [2, 0, 0, 3], [3, 0, 0, 0], [4, 1, 0, 0]],
                  columns=['index', 'A', 'B', 'C'])

def formatter(x):
    x = x[x > 0]
    return (x.index[1:].astype(str) + '-' + x[1:].astype(str))

df['Positives'] = df.apply(formatter, axis=1).apply(', '.join)

print(df)

   index  A  B  C  Positives
0      1  0  1  2   B-1, C-2
1      2  0  0  3        C-3
2      3  0  0  0          
3      4  1  0  0        A-1

如果您需要过滤掉零长度字符串,则可以使用False将空字符串计算为bool的事实:

res = df[df['Positives'].astype(bool)]

print(res)

   index  A  B  C  Positives
0      1  0  1  2   B-1, C-2
1      2  0  0  3        C-3
3      4  1  0  0        A-1

答案 1 :(得分:0)

我会用np.NaN替换零,以删除您不关心的内容和stack。然后形成你想要的字符串和groupby.apply(list)

import numpy as np

df = df.set_index('index') # if 'index' is not your index.

stacked = df.replace(0, np.NaN).stack().reset_index()
stacked['Positives'] = stacked['level_1'] + '-' + stacked[0].astype(int).astype('str')
stacked = stacked.groupby('index').Positives.apply(list).reset_index()

stacked现在是:

   index   Positives
0      1  [B-1, C-2]
1      2       [C-3]
2      4       [A-1]

或者,如果您只想要一个字符串而不是列表,请更改最后一行:

stacked.groupby('index').Positives.apply(lambda x: ', '.join(list(x))).reset_index()
#   index Positives
#0      1  B-1, C-2
#1      2       C-3
#2      4       A-1