如何遍历熊猫并匹配条件

时间:2020-08-21 04:41:57

标签: python pandas dataframe

输入表: Input table

输出表: Output table

我似乎无法弄清楚。我需要将值1的列分组为新列“ New_column”。有人能帮我吗。这是我尝试过的代码。

for (index_label, row_series) in data.iterrows():
print('Row Index label : ', index_label)
print('Row Content as Series : ', row_series.values)

6 个答案:

答案 0 :(得分:4)

您可以使用dot实现它:

    df = pd.DataFrame(
    {
        'A': [0,0,1],
        'B': [1,0,0],
        'C': [0,0,0,],
        'D': [1,0,1],
        'F': [1,0,1]
    }
)
df['new_column'] = df.dot(df.columns).str.join(",")



    A   B   C   D   F   new_column
0   0   1   0   1   1   B,D,F
1   0   0   0   0   0   
2   1   0   0   1   1   A,D,F

更新:对于包含多个字母的列,@ BEN_YO建议了一个非常好的解决方案:

df.dot(df.columns+',').str[:-1]

答案 1 :(得分:1)

如果列名更像一个字符,请使用DataFrame.dot,并在列名中添加分隔符,最后在右边用Series.str.rstrip删除:

ElasticsearchOperations

df['new_column'] = df.dot(df.columns + ',').str.rstrip(",")
#alternative
#df['new_column'] = (df @ (df.columns + ',')).str.rstrip(",")

print (df)
   A  B  C  D  F new_column
0  0  1  0  1  1      B,D,F
1  0  0  0  0  0           
2  1  0  0  1  1      A,D,F

替代解决方案:

df = pd.DataFrame({
        'col1': [0,0,1],
        'col2': [1,0,0],
        'col3': [0,0,0,],
        'col4': [1,0,1],
        'col5': [1,0,1]})


df['new_column'] = df.dot(df.columns + ',').str.rstrip(",")
#alternative
#df['new_column'] = (df @ (df.columns + ',')).str.rstrip(",")

print (df)
   col1  col2  col3  col4  col5      new_column
0     0     1     0     1     1  col2,col4,col5
1     0     0     0     0     0                
2     1     0     0     1     1  col1,col4,col5

性能

不能使用cols = df.columns.to_numpy() df["new_column"] = [', '.join(cols[x]) for x in df.to_numpy().astype(bool)] 中的第一个解决方案,因为有50列,所以有些列包含2个或更多字母。还sammywemmy的解决方案创建列表,因此也请不要进行测试。

footfalcon

最快的是列表理解解决方案,但仅在10ms的样本数据中,然后才是真正的快速df = pd.DataFrame({ 'A': [0,0,1], 'B': [1,0,0], 'C': [0,0,0,], 'D': [1,0,1], 'E': [1,0,1]}) [30000 rows x 50 columns] df = pd.concat([df] * 10, ignore_index=True, axis=1) df = pd.concat([df] * 10000, ignore_index=True).add_prefix('col') 解决方案,最后是dot解决方案:

apply

In [70]: %%timeit
    ...: cols = df.columns.to_numpy()
    ...: df["new_column"] = [', '.join(cols[x]) for x in df.to_numpy().astype(bool)]
    ...: 
128 ms ± 443 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

#for testing are values converted to boolean (else test fail)
In [72]: %timeit df['new_column'] = df.astype(bool).dot(df.columns + ',').str.rstrip(",")
138 ms ± 1.95 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

答案 2 :(得分:0)

不确定这是否是最好的解决方案,但可以完成工作:

import pandas as pd

df = pd.DataFrame(
    {
        'A': [0,0,1],
        'B': [1,0,0],
        'C': [0,0,0,],
        'D': [1,0,1],
        'F': [1,0,1]
    }
)

df1 = df.T
new_cells = []
for c in df1.columns:
    new_cells.append(df1[df1[c] == 1].index.tolist())
df['New_column'] = new_cells

输出:

A   B   C   D   F   New_column
0   0   1   0   1   1   [B, D, F]
1   0   0   0   0   0   []
2   1   0   0   1   1   [A, D, F]

答案 3 :(得分:0)

尝试此方法。

df = pd.DataFrame({"A":[0,0,1],"B":[1,0,0],"C":[0,0,0],"D":[1,0,1],"F":[1,0,1]})

df["new_column"] = df.apply(lambda x: (pd.DataFrame(x[x==1]).index.values),axis=1)
df["new_column"] = df["new_column"].apply(lambda x: ','.join(map(str, x)))

输出

   A  B  C  D  F new_column
0  0  1  0  1  1      B,D,F
1  0  0  0  0  0           
2  1  0  0  1  1      A,D,F

答案 4 :(得分:0)

您可以将applylambda上的axis=1功能一起使用

df["New_column"] = df.apply(lambda x: ','.join(df.columns[x==1]), axis=1)
df
   A  B  C  D  F New_column
0  0  1  0  1  1      B,D,F
1  0  0  0  0  0
2  1  0  0  1  1      A,D,F

答案 5 :(得分:0)

如果您的python> = 3.5,则可以使用matmul运算符将dot product设为-

df['new_column'] = (df @ df.columns).str.join(', ')
   A  B  C  D  E new_column
0  0  1  0  1  1    B, D, E
1  0  0  0  0  0           
2  1  0  0  1  1    A, D, E

或者您可以使用apply来解决axis = 1上的问题,如下所示-

df['new_column'] = df.apply(lambda x: ', '.join(list(x[x!=0].index)), axis=1)
   A  B  C  D  E new_column
0  0  1  0  1  1    B, D, E
1  0  0  0  0  0           
2  1  0  0  1  1    A, D, E