【问题标题】:Appending variable length columns in Pandas dataframe Python在 Pandas 数据框 Python 中附加可变长度列
【发布时间】:2016-09-19 20:11:27
【问题描述】:

我有一些 csv 文件,其中包含许多位置的一对轴承。我正在尝试扩展值以包含每个位置的轴承对之间的每个数字,并将可变长度导出为相同格式的 csv。

例子:

df = pd.read_csv('bearing.csv')

数据结构:

     A         B           C         D           E            
0    0         94          70        67          84       
1    120       132         109       152         150          

理想的结果是一个可变长度的多维数组:

     A         B           C         D           E            
0    0         94          70        67          84       
1    1         95          71        68          85  
2    3         96          72        69          86
...
n    120       132         109       152         150

我正在遍历每一列并获取这对值的范围,但是在尝试用新的值范围覆盖旧列时我很挣扎。

for col in bear:
    min_val = min(bear[col])
    max_val = max(bear[col])
    range_vals = range(min(bear[col]), max(bear[col])+1)
    bear[col] = range_vals

我收到以下错误:

 ValueError: Length of values does not match length of index

【问题讨论】:

  • pandas 数据帧需要每列的长度相同,没有真正的解决方法。您可以为每个范围创建单独的Series,否则我不确定如何实现您想要做的事情。如果您在同一数据框中确实有这些可变长度列,那么不同列中的值集位于同一行中意味着什么?这些行是否暗示任何类型的关系?

标签: python for-loop pandas multidimensional-array dataframe


【解决方案1】:

您可以在DataFrame 构造函数中将dictminmax 一起使用,但在列末尾您会得到很多NaN

df = pd.DataFrame({col: pd.Series(range(df[col].min(), 
                                        df[col].max() + 1)) for col in df.columns })
print (df)
print (df)

       A      B     C     D      E
0      0   94.0  70.0  67.0   84.0
1      1   95.0  71.0  68.0   85.0
2      2   96.0  72.0  69.0   86.0
3      3   97.0  73.0  70.0   87.0
4      4   98.0  74.0  71.0   88.0
5      5   99.0  75.0  72.0   89.0
6      6  100.0  76.0  73.0   90.0
7      7  101.0  77.0  74.0   91.0
8      8  102.0  78.0  75.0   92.0
9      9  103.0  79.0  76.0   93.0
10    10  104.0  80.0  77.0   94.0
11    11  105.0  81.0  78.0   95.0
12    12  106.0  82.0  79.0   96.0
13    13  107.0  83.0  80.0   97.0
14    14  108.0  84.0  81.0   98.0
15    15  109.0  85.0  82.0   99.0
16    16  110.0  86.0  83.0  100.0
17    17  111.0  87.0  84.0  101.0
18    18  112.0  88.0  85.0  102.0
19    19  113.0  89.0  86.0  103.0
20    20  114.0  90.0  87.0  104.0
21    21  115.0  91.0  88.0  105.0
22    22  116.0  92.0  89.0  106.0
23    23  117.0  93.0  90.0  107.0
24    24  118.0  94.0  91.0  108.0
25    25  119.0  95.0  92.0  109.0
26    26  120.0  96.0  93.0  110.0
27    27  121.0  97.0  94.0  111.0
28    28  122.0  98.0  95.0  112.0
29    29  123.0  99.0  96.0  113.0
..   ...    ...   ...   ...    ...
91    91    NaN   NaN   NaN    NaN
92    92    NaN   NaN   NaN    NaN
93    93    NaN   NaN   NaN    NaN
94    94    NaN   NaN   NaN    NaN
95    95    NaN   NaN   NaN    NaN
96    96    NaN   NaN   NaN    NaN
97    97    NaN   NaN   NaN    NaN
98    98    NaN   NaN   NaN    NaN
99    99    NaN   NaN   NaN    NaN
100  100    NaN   NaN   NaN    NaN
101  101    NaN   NaN   NaN    NaN
102  102    NaN   NaN   NaN    NaN
103  103    NaN   NaN   NaN    NaN
104  104    NaN   NaN   NaN    NaN
105  105    NaN   NaN   NaN    NaN
106  106    NaN   NaN   NaN    NaN
107  107    NaN   NaN   NaN    NaN
108  108    NaN   NaN   NaN    NaN
109  109    NaN   NaN   NaN    NaN
110  110    NaN   NaN   NaN    NaN
111  111    NaN   NaN   NaN    NaN
112  112    NaN   NaN   NaN    NaN
113  113    NaN   NaN   NaN    NaN
114  114    NaN   NaN   NaN    NaN
115  115    NaN   NaN   NaN    NaN
116  116    NaN   NaN   NaN    NaN
117  117    NaN   NaN   NaN    NaN
118  118    NaN   NaN   NaN    NaN
119  119    NaN   NaN   NaN    NaN
120  120    NaN   NaN   NaN    NaN

如果你只有几列,可以使用:

df = pd.DataFrame({'A': pd.Series(range(df.A.min(), df.A.max() + 1)),
                   'B': pd.Series(range(df.B.min(), df.B.max() + 1))})

编辑:

如果min值在第一行,max在最后,你可以使用iloc

df = pd.DataFrame({col: pd.Series(range(df[col].iloc[0], 
                                        df[col].iloc[-1] + 1)) for col in df.columns })

时间安排

In [3]: %timeit ( pd.DataFrame({col: pd.Series(range(df[col].iloc[0], df[col].iloc[-1] + 1)) for col in df.columns }) )
1000 loops, best of 3: 1.75 ms per loop

In [4]: %timeit ( pd.DataFrame({col: pd.Series(range(df[col].min(), df[col].max() + 1)) for col in df.columns })  )
The slowest run took 5.50 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 2.18 ms per loop

【讨论】:

  • 非常感谢!工作一种享受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2019-03-08
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多