我有一個 .csv 檔案,有 29 列和 1692 行。列D_INT_1和D_INT_2只是日期。如果 : 之間有日期,我想檢查這兩列>= "2022-03-01" and <= "2024-12-31。并且,如果找到一個值,我想顯示找到的日期 "NAME"位于所述找到的值的同一行上的列的值。
這就是我現在所做的,但它只獲取日期而不是相鄰的 value ('NAME')。
# importing module
import pandas as pd
# reading CV file
df = pd.read_csv("scratch_2.csv")
# converting column data to list
D_INT_1 = df['D_INT_1'].tolist()
D_INT_2 = df['D_INT_2'].tolist()
ext = []
ext = [i for i in D_INT_1 D_INT_2 if i >= "2022-03-01" and i <= "2024-12-31"]
print(*ext, sep="\n")
這就是我想得到的:
DF 示例:
NAME, ADDRESS, D_INT_1, D_INT_2
Mark, H4N1V8, 2023-01-02, 2019,-01-01
預期輸出:
MARK, 2023-01-02
uj5u.com熱心網友回復:
很多時候緊湊的[for in]語法可以有效地用于簡單的代碼,但在這種情況下我不推薦它。我建議你使用普通的for. 下面是一個例子:
# importing module
import pandas as pd
# reading CV file
df = pd.read_csv("scratch_2.csv")
# converting column data to list
D_INT_1 = df['D_INT_1'].tolist()
D_INT_2 = df['D_INT_2'].tolist()
NAMES = df['NAME'].tolist()
# loop for every row in the data
# (i will start as 0 and increase by 1 every iteration)
for i in range(0, len(D_INT_1)):
if D_INT_1[i] >= "2022-03-01" and D_INT_1[i] <= "2024-12-31":
print(NAME[i], D_INT_1[i])
if D_INT_2[i] >= "2022-03-01" and D_INT_2[i] <= "2024-12-31":
print(NAME[i], D_INT_2[i])
uj5u.com熱心網友回復:
首先為了性能不要使用回圈,因為存在矢量化替代品 unpivot byDataFrame.melt和 filter by Series.betweenwith DataFrame.loc:
df = df.melt(id_vars='NAME', value_vars=['D_INT_1','D_INT_2'], value_name='Date')
df1 = df.loc[df['Date'].between("2022-03-01","2024-12-31"), ['NAME','Date']]
print (df1)
NAME Date
0 Mark 2023-01-02
或過濾原始資料幀并最后加入concat:
df1 = df.loc[df['D_INT_1'].between("2022-03-01","2024-12-31"), ['NAME','D_INT_1']]
df2 = df.loc[df['D_INT_2'].between("2022-03-01","2024-12-31"), ['NAME','D_INT_2']]
df = pd.concat([df1.rename(columns={'D_INT_1':'date'}),
df2.rename(columns={'D_INT_2':'date'})])
print (df)
NAME date
0 Mark 2023-01-02
最后如果需要回圈輸出print:
for i in df.itertuples():
print (i.NAME, i.Date)
Mark 2023-01-02 00:00:00
Mark 2019-01-01 00:00:00
uj5u.com熱心網友回復:
所以這里有幾點需要注意:
在這種情況下,您最好使用普通的 for 回圈,因為它可能會更復雜一些。
要做你想做的事,你首先要:
- 加載名稱:
D_INT_1 = df['D_INT_1'].tolist()
D_INT_2 = df['D_INT_2'].tolist()
NAMES = df['NAME'].tolist()
- 使用 enumerate 因為我們知道所有串列在回圈中都對齊,請記住 enumerate 獲取值和索引,但我手動獲取值只是為了更清晰(和更清晰)的代碼:
ext = []
for i,_ in enumerate(D_INT_1):
if D_INT_1[i] >= "2022-03-01" and D_INT_1[i] <= "2024-12-31":
ext.append((D_INT_1[i],NAMES[i]))
if D_INT_2[i] >= "2022-03-01" and D_INT_1[i] <= "2024-12-31":
ext.append((D_INT_2[i],NAMES[i]))
當然,您可以使用串列推導式(或者在本例中為兩種),但是對于此答案,這種形式應該更容易理解。
為此,您仍然需要像第一步那樣加載名稱,然后在串列理解中使用 enumerate,同時在元組中將名稱添加到 i 之后,可能是這樣的:
ext = [(i,NAMES[ind]) for ind,i in enumerate(D_INT_1 D_INT_2) if i >= "2022-03-01" and i <= "2024-12-31"]
請記住,我沒有測驗上述代碼,因為我無法訪問原始 csv,但這應該是一個很好的起點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/354555.html
