我有包含每周資料的資料框,我只從中獲取了唯一的 ID:
weekID = df["meterID"].unique().tolist()
假設它看起來像這樣:
[1,
2,
3,
4,
5,
6,
7,
8,
9,
10]
對于這個每周資料的每一天,我只使用符合我條件的 ID,所以假設我有 7 個串列:
第1天
[2,
3]
第2天
[3,
4,
5]
第3天
[6,
7]
第4天
[2,
3,
4,
5,
6,
7,
8]
第5天
[8,
9]
第六天
[2,
3]
第7天
[2,
3]
我想把這些東西放在一個 .csv 檔案中,其中:
- weekID 中的所有 ID 都是索引
- 每天串列將作為新列附加 column_name = date 所以最終輸出看起來很簡單:
ID day1 day2 day3 day5 day6 day7
1
2 YES YES YES
3 YES YES YES YES
4 YES
5 YES
6 YES
7 YES
8 YES
9 YES
10
我試過了:
df = pd.DataFrame()
df["weekID"] = weekID
dfSuspects["day1"] = ID_day1
output: ValueError: Length of values (94) does not match length of index (495)
我會非常感激告訴我我做錯了什么。
uj5u.com熱心網友回復:
讓我們從您的陣列開始:
day1 = [2, 3]
day2 = [3, 4, 5]
day3 = [6, 7]
day4 = [2, 3, 4, 5, 6, 7, 8]
day5 = [8, 9]
day6 = [2, 3]
day7 = [2, 3]
為方便起見,讓我們將它們收集到一個結構中:
>>> local_vars = locals()
>>> days = [local_vars[f'day{i}'] for i in range(1, 8)]
[[2, 3], [3, 4, 5], [6, 7], [2, 3, 4, 5, 6, 7, 8], [8, 9], [2, 3], [2, 3]]
您可以通過任何其他方式進入這個階段,這只是為了建立一個端到端的解決方案。
現在,您只需要遍歷每一天 - 為每個索引值創建一個串列,其中包含每個索引值的值,無論當天是否存在于串列中,然后最后將其全部包裝到資料框中:
pd.DataFrame(
{
f'day{i 1}': [x in day for x in range(10)]
for i, day in enumerate(days)
}
)
最后結果:
day1 day2 day3 day4 day5 day6 day7
0 False False False False False False False
1 False False False False False False False
2 True False False True False True True
3 True True False True False True True
4 False True False True False False False
5 False True False True False False False
6 False False True True False False False
7 False False True True False False False
8 False False False True True False False
9 False False False False True False False
如果你真的想要字串替換x in day為'TRUE' if x in day else '':
day1 day2 day3 day4 day5 day6 day7
0
1
2 TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE TRUE
4 TRUE TRUE
5 TRUE TRUE
6 TRUE TRUE
7 TRUE TRUE
8 TRUE TRUE
9 TRUE
uj5u.com熱心網友回復:
假設你有七個串列,首先找到其中的最大索引
day1 = [2, 3]
day2 = [3, 4, 5]
day3 = [6, 7]
day4 = [2, 3, 4, 5, 6, 7, 8]
day5 = [8, 9]
day6 = [2, 3]
day7 = [2, 3]
days = [globals()[f'day{i 1}'] for i in range(7)]
max_id = max(map(max, days))
然后創建一個空資料框,其列號與天數匹配,索引范圍結束于max_id
df = pd.DataFrame(columns=[f'day{i 1}' for i in range(7)], index=range(1, max_id 1))
然后apply在列上檢查索引是否在日串列中。
df = df.apply(lambda col: col.index.isin(globals()[col.name]), axis=0)
print(df)
day1 day2 day3 day4 day5 day6 day7
1 False False False False False False False
2 True False False True False True True
3 True True False True False True True
4 False True False True False False False
5 False True False True False False False
6 False False True True False False False
7 False False True True False False False
8 False False False True True False False
9 False False False False True False False
最后,根據需要替換True和值False
df = df.replace({True: 'Yes', False: ''})
print(df)
day1 day2 day3 day4 day5 day6 day7
1
2 Yes Yes Yes Yes
3 Yes Yes Yes Yes Yes
4 Yes Yes
5 Yes Yes
6 Yes Yes
7 Yes Yes
8 Yes Yes
9 Yes
uj5u.com熱心網友回復:
這看起來有點像.str.get_dummies()可以解決的問題:
days = [[2, 3], [3, 4, 5], [6, 7], [2, 3, 4, 5, 6, 7, 8], [8, 9], [2, 3], [2, 3]]
ser = pd.Series(
["|".join(map(str, day)) for day in days],
index=[f"day{i}" for i in range(1, len(days) 1)]
)
result = (
ser.str.get_dummies().replace({1: "YES", 0: ""}).rename(int, axis=1).T
.sort_index()
)
結果:
day1 day2 day3 day4 day5 day6 day7
2 YES YES YES YES
3 YES YES YES YES YES
4 YES YES
5 YES YES
6 YES YES
7 YES YES
8 YES YES
9 YES
但是由于1在任何一天都不存在,因此相應的行丟失了。那么這是事故還是真的會發生?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464381.html
