【问题标题】:Change hardcode to more flexible using python for loop使用 python for 循环将硬代码更改为更灵活
【发布时间】:2020-07-16 22:44:51
【问题描述】:

我正在编写有关绘图的代码。我用 hardcode 方式编写,所以我的代码不够灵活。

我知道可以使用 for 循环 来解决 hardcode 问题。但是我的Python能力不够强。

这是我的代码。

df1 = df[df.cluster==0]
df2 = df[df.cluster==1]
df3 = df[df.cluster==2]

plt.scatter(df1.Age,df1['Income($)'],color='green')
plt.scatter(df2.Age,df2['Income($)'],color='red')
plt.scatter(df3.Age,df3['Income($)'],color='black')

在这种情况下,有 3 个集群。如果cluster = 4,则需要多写。 df4 = ...

我可以写一个for循环吗,比如这样

n = number of cluster
for i in range(n):
    df(random) = df[df.cluster==i]
for j in range(n):
    plt.scatter(df(n).Age,df(n)['Income($)'],color='RANDOM')

我的问题是只写几行代码,而不是使用硬编码方式。

【问题讨论】:

    标签: python dataframe matplotlib pylot


    【解决方案1】:

    如果您正在寻找一个简单的解决方案,这可能就是它。 (我重用了你的代码示例)

    n = num_of_clusters
    my_colors = ['green', 'red', 'black', ...]
    for i in range(n):
        df_i = df[df.cluster == i]
        plt.scatter(df_i.Age, df_i['Income($)'], color=my_colors[i])
    

    【讨论】:

      【解决方案2】:

      一种可能性:

      colors = ['green', 'red', 'black']
      
      for i in range(3):
          df_temp = df[df.cluster==i]
          plt.scatter(df_temp.Age, df_temp['Income($)'], color=colors[i])
      

      【讨论】:

        【解决方案3】:

        这是pandas中的经典“groupby”操作。

        看看一些关于使用 groupby 的帖子。你可以...

        • 使用groupby根据cluster的值进行分组
        • 使用 for 循环遍历组并...
        • 在组容器中绘制每个组。

        这里是一个使用groupby的例子

        In [57]: from matplotlib import pyplot as plt                                   
        
        In [58]: import pandas as pd                                                    
        
        In [59]: data = {'year':[1976, 1979, 1982, 1978, 1982], 'income':[200, 170, 100,
            ...:  50, 120], 'cluster': [1, 1, 1, 2, 2]}                                 
        
        In [60]: df = pd.DataFrame(data)                                                
        
        In [61]: df                                                                     
        Out[61]: 
           year  income  cluster
        0  1976     200        1
        1  1979     170        1
        2  1982     100        1
        3  1978      50        2
        4  1982     120        2
        
        In [62]: for label, df in df.groupby('cluster'): 
            ...:     plt.plot(df['year'], df['income'], label=label) 
            ...:                                                                        
        
        In [63]: plt.legend()                                                           
        Out[63]: <matplotlib.legend.Legend at 0x7fe792601e80>
        
        In [64]: plt.show() 
        

        产生:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-05
          • 2021-11-23
          • 2018-08-13
          • 2017-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多