第一次在這里發帖,尋求我未能解決的問題。我主要是想在一個pandas資料框架上進行迭代,而不覆寫之前的資料。目前,我的代碼可以獲得第一個實體,但無法迭代下一組 "值"。見下文。非常感謝任何幫助!
import pandas as pd
import numpy as np
#加載csv資料
data = pd.read_csv(r "C:UsersAdminDesktopdata.csv")
# 將csv資料轉換成pandas資料幀。
df = pd. DataFrame(data, columns = ["Date"/span>, "B1"/span>, "B2"/span>, "B3"/span>, "B4"/span>, "B5"/span>]
主代碼:
for n in range(1, 10)。)
df[n] = pd.Series(["X" if df. iat[x, y] == n else "" for y in range(1, 6) for x in range(0,4) ])
不正確的輸出表:
| 日期 | B1 | B2 | B3 | B4 | B5 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 8/22/19 |
|---|
8/25/19
8/29/19
正確的輸出表:
| 日期 | B1 | B2 | B3 | B4 | B5 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 8/22/19 |
|---|
8/25/19
8/27/19
8/29/19
我希望這有意義。謝謝你!! :)
uj5u.com熱心網友回復:
讓我們試著不使用for回圈并應用
s = df.filter(like='B'/span>).stack()
s = pd.crosstab(s.index.get_level_values(level=0),s) 。 replace({0:',1:'X'})
s.columns = s.columns.astype(str)
out = s.reindex(columns = df.columns).combined_first(df)
日期 B1 B2 B3 B4 B5 1 2 3 4 5 6 7 8
行_0
0 8/22/19 2。 0 3.0 38.0 39.0 40.0 X X
1 8/25/19 5. 0 8.0 16.0 20.0 25.0 X X
2 8/27/19 3。 0 4.0 19.0 35.0 39.0 X X
3 8/29/19 1. 0 2.0 6.0 15.0 19.0 X X
uj5u.com熱心網友回復:
我認為使用apply函式會讓事情變得更簡單:每當你制作一個新的列時,你會遍歷DataFrame的每一行,如果該列的值包含在被考慮的行中,那么你新列的每一行都被設定為 "X"。為了避免覆寫任何東西,你可以通過 "Date "對DataFrame進行索引,并且只對原始DataFrame的前5列應用這個函式。
for n in range(1, 10)。)
df[n] = df.iloc[:,:5].apply(lambda x: "X" if n in x. values else "", axis=1)
結果:
df
B1 B2 B3 B4 B5 1 2 3 4 5 6 7 8 9
日期
8/22/19 2 3 38 39 40 X X
8/25/19 5 8 16 20 25 X X
8/27/19 3 4 19 35 39 X X
8/29/19 1 2 6 15 19 X X X
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309478.html
標籤:
