【问题标题】:for loop to create a matrix in pythonfor循环在python中创建一个矩阵
【发布时间】:2018-01-16 08:00:20
【问题描述】:

我正在尝试研究我的数据中具有零值的概率,并且我开发了一个代码,当另一列数据为零时输出一列数据的值,这正是我所需要的。但是,对于我的 577by29 数据帧中的所有其他 28 列而言,必须对每一列都这样做是很困难的,所以我决定创建一个 for 循环来为我这样做:

import numpy as np
import pandas as pd
allchan = pd.read_csv('allchan.csv',delimiter = ' ')
allchanarray = np.array(allchan)
dfallchan = pd.DataFrame(allchanarray,range(1,578),dtype=float)
y = pd.DataFrame()
x = pd.DataFrame()
for n in range(0,29):
    x[n] = dfallchan[(dfallchan[0]>0) & (dfallchan[n]==0)][0]
    y[n] = x[n].count()
x.to_excel('n.xlsx', index=False, sheet_name='ValForOtherZero')
y.to_excel('v.xlsx', index=False, sheet_name='CountOfZeroVlas')

问题是由于某种原因循环正确地通过了线路:

 x[n] = dfallchan[(dfallchan[0]>0) & (dfallchan[n]==0)][0]
 y[n] = x[n].count()

但是对于第二个条件它重复了 n=6 的值:

(dfallchan[n]==0)

代码的输出应该返回第一个通道的不同值,因为零在我的输入文件中随机分布,但我的输出对于数据直到第 6 列是正确的 - 因为我的列 (0-5) 应该为空 - 它重复所有其他列的输出! 输出: output 1

您可以看到代码正确循环,因为输出数据帧有 n=29 列,但不适用于上面指定的条件。

请帮忙,谢谢!

【问题讨论】:

标签: python arrays for-loop dataframe


【解决方案1】:

这样会更有效率。

all_values = []
for n in range(0,29):
    condition = (dfallchan[0]>0) & (dfallchan[n]==0)
    count = condition.sum()
    vals = dfallchan[condition][0].values
    all_values.append(vals)

all_values_df = pd.DataFrame(all_values).transpose()

在这里,我首先创建一个列表列表并将所有值附加到其中。然后最后我正在创建数据框并转置它。

【讨论】:

    【解决方案2】:

    终于明白了!

    这段代码完全符合我的要求!

    # In[9]:
    
    import numpy as np
    import pandas as pd
    
    
    # In[10]:
    
    allchan = pd.read_csv('allchan.csv',delimiter = ' ')
    
    
    # In[11]:
    
    allchanarray = np.array(allchan)
    
    
    # In[12]:
    
    dfallchan = pd.DataFrame(allchanarray,range(1,578),dtype=float)
    
    
    # In[13]:
    
    v = pd.DataFrame(columns=range(0,29))
    y = pd.DataFrame()
    k = pd.DataFrame(columns=range(0,29))
    
    
    # In[14]:
    
    for n in range(0,29):
        x = dfallchan[(dfallchan[0]>0) & (dfallchan[n]==0)][0]
        y = y.append(x)
        v = y.transpose()
        k = v.count()
    
    
    # In[15]:
    
    v.columns=range(0,29)
    k = k.values.reshape(1,29)
    
    
    # In[16]:
    
    v.to_excel("Chan1-OthersZeroVals.xlsx", index=False)
    pd.DataFrame(k).to_excel("Chan1-OtherZeroCount.xlsx", index=False)
    

    【讨论】:

    • 附加到数据帧效率低下。而是先制作整个数据,然后从最终数据制作数据框。
    • 看看我上面的回答。询问您是否遇到任何问题。
    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2022-01-09
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2015-06-12
    相关资源
    最近更新 更多