我正在编写一个脚本,其中我在csv中读取了多个列和行。我需要脚本将每列中的值合计为一行,并返回哪些列的行值为零。以下是数据外观的示例,还有其他几个列,但这些是我的问题所关注的列:
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
0 0 5 5 0 5 5 5 5 0 0 0
这是我到目前为止所做的:
import pandas as pd
import os
os.chdir('C:\\users\\vroland\\desktop\\RR_WMD\\WUdata')
fout=open("WUinput.csv","a")
#read water use file
df=pd.read_csv("WUtest.csv")
#Header & months with zero values
cols=df.columns
#Boolean array of columns with zero values
bt=df.apply(lambda x: x==0)
#List months with zero values
zar=bt.apply(lambda x:list(cols[x.values]),axis=1)
我尝试了各种方法,包括if
语句,但我不断收到错误,说明我的条件语句含糊不清,所以我正在尝试另一种方法。所以这就是我现在要处理的代码块:
a=30
b=31
c=28
num_days=pd.DataFrame({'JAN':[b],'FEB':[c],'MAR':[b],'APR':[a],'MAY':[b],
'JUN':[a],'JUL':[b],'AUG':[b],'SEP':[a],'OCT':[b],
'NOV':[a],'DEC':[b]})
我们的想法是使用zar
中返回的值来查找数据框num_days
中的相应日期值。返回此值并计算值为零的总天数。
答案 0 :(得分:0)
returnArray = []
i=0
while i < len(df.values):
j=14 #since user only cares about column 14-26
while j < len(df.values[i]):
if df.values[i][j] == 0:
returnArray.append([i,j])
j=j+1
i=i+1
答案 1 :(得分:0)
考虑pd.DataFrame
df
cols = ['JAN', 'FEB', 'MAR', 'APR',
'MAY', 'JUN', 'JUL', 'AUG',
'SEP', 'OCT', 'NOV', 'DEC']
df = pd.DataFrame(np.random.randint(0, 3, (10, 12)), columns=cols)
df
我将row == 0
的每一行评估用作列本身的布尔掩码。使用list
很好地适应pd.Series
df.eq(0).apply(lambda x: list(df.columns[x]), 1)
0 [FEB, MAR, APR, NOV]
1 [FEB, OCT, NOV]
2 [JAN, APR, AUG, NOV, DEC]
3 [MAR, APR, SEP]
4 [MAY, JUN, NOV, DEC]
5 [APR, AUG, NOV]
6 [MAR, APR, JUN, OCT, NOV, DEC]
7 [JAN, FEB, APR, JUL, OCT, NOV, DEC]
8 [MAY, JUL, AUG, SEP, OCT]
9 [FEB, MAR, APR, JUN, AUG, SEP]
dtype: object
获取天数
days_in_month = pd.Series(dict(
JAN=31, FEB=28, MAR=31,
APR=30, MAY=31, JUN=30,
JUL=31, AUG=31, SEP=30,
OCT=31, NOV=30, DEC=31
))
df.eq(0).dot(days_in_month)
0 119
1 89
2 153
3 91
4 122
5 91
6 183
7 212
8 154
9 180
dtype: int64