亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何遍歷熊貓并匹配條件

如何遍歷熊貓并匹配條件

一只甜甜圈 2023-06-13 16:05:23
入表: 輸出表: 我似乎無法弄清楚。我需要將值為 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 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

你可以用點來實現它:

? 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]


查看完整回答
反對 回復 2023-06-13
?
米脂

TA貢獻1836條經驗 獲得超3個贊

如果列名更像一個字符,請使用DataFrame.dot向列名添加分隔符并最后從右側刪除Series.str.rstrip

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)]

性能:


sammywemmy無法使用第一個解決方案,因為有 50 列,所以有些列有 2 個或更多字母。也是footfalcon創建列表的解決方案,所以也不要測試。


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')

最快的是列表理解解決方案,但樣本數據只有 10 毫秒,然后是真正快速的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)

#Dishin H Goyani

In [73]: %timeit df["New_column"] = df.apply(lambda x: ','.join(df.columns[x==1]), axis=1)

3.98 s ± 129 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


#Akshay Sehgal

In [75]: %timeit df['new_column'] = df.apply(lambda x: ', '.join(list(x[x!=0].index)), axis=1)

11 s ± 349 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


#Rajith Thennakoon

In [78]: %%timeit

? ? ...: 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)))

? ? ...:?

? ? ...:?

25.9 s ± 709 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


查看完整回答
反對 回復 2023-06-13
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

不確定這是否是最佳解決方案,但它可以完成工作:


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]


查看完整回答
反對 回復 2023-06-13
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

如果你有 python >= 3.5,你可以使用 matmul 運算符來做一個點積——

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

或者您可以使用applyaxis=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


查看完整回答
反對 回復 2023-06-13
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

您可以使用applywith lambdafunction onaxis=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


查看完整回答
反對 回復 2023-06-13
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

試試這個方法。


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


查看完整回答
反對 回復 2023-06-13
  • 6 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號