我似乎无法弄清楚。我需要将值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)
答案 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)
您可以将apply
与lambda
上的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