熊猫:含有元组的熔化柱

时间:2016-04-21 14:42:29

标签: python pandas dataframe

考虑一个pandas df,其列包含相等长度的元组。

    public ActionResult Contact()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Contact(Models.ContactModels c)
    {
        if (ModelState.IsValid)
        {
            try
            {
                MailMessage msg = new MailMessage();
                SmtpClient smtp = new SmtpClient();
                MailAddress from = new MailAddress(c.Email.ToString());
                StringBuilder sb = new StringBuilder();

                msg.To.Add("myEmailHere@gmail.com");
                msg.Subject = "Contact Us";
                msg.IsBodyHtml = false;
                smtp.Host = "smtp.gmail.com";

                smtp.Port = 993;

                sb.Append("Name: " + c.FullName);
                sb.Append(Environment.NewLine);

                sb.Append("Email: " + c.Email);
                sb.Append(Environment.NewLine);

                sb.Append("Phone: " + c.Phone);
                sb.Append(Environment.NewLine);

                sb.Append("Comment: " + c.Comment);
                sb.Append(Environment.NewLine);

                msg.Body = sb.ToString();
                smtp.Send(msg);
                msg.Dispose();

                return View("Success");
            }
            catch(Exception)
            {
                return View("Error");
            }
        }

        return View();
    }

最简单的方法是如下垂直展开?:

L1 = [['ID1', ('key1a','key1b','key1c'), ('value1a','value1b','value1c')],
      ['ID2', ('key2a','key2b','key2c'), ('value2a','value2b','value2c')]]
df1 = pd.DataFrame(L1,columns=['ID','Key','Value'])

>>> df1
    ID                    Key                        Value
0  ID1  (key1a, key1b, key1c)  (value1a, value1b, value1c)
1  ID2  (key2a, key2b, key2c)  (value2a, value2b, value2c)

4 个答案:

答案 0 :(得分:2)

快速解决方案

df1.set_index('ID').stack().apply(lambda x: pd.Series(x)).unstack(0).T.reset_index()

答案 1 :(得分:1)

{ 0 | 1 }

计时(10k行)

rows = []
for _, row in df1.iterrows():
    [rows.append([row['ID'], key, val]) for key, val in zip(row['Key'], row['Value'])]

>>> pd.DataFrame(rows)
     0      1        2
0  ID1  key1a  value1a
1  ID1  key1b  value1b
2  ID1  key1c  value1c
3  ID2  key2a  value2a
4  ID2  key2b  value2b
5  ID2  key2c  value2c

答案 2 :(得分:0)

更快的矢量化方式是使用np.repeatnp.concatenate

In [2272]: pd.DataFrame({'ID': df1['ID'].values.repeat(df1['Key'].str.len()),
      ...:               'Key': np.concatenate(df1['Key']),
      ...:               'Value': np.concatenate(df1['Value'])})
Out[2272]:
    ID    Key    Value
0  ID1  key1a  value1a
1  ID1  key1b  value1b
2  ID1  key1c  value1c
3  ID2  key2a  value2a
4  ID2  key2b  value2b
5  ID2  key2c  value2c

计时

In [2278]: df1.shape
Out[2278]: (10000, 3)

In [2275]: %%timeit
      ...:  pd.DataFrame({'ID': df1['ID'].values.repeat(df1['Key'].str.len()),
      ...:                'Key': np.concatenate(df1['Key']),
      ...:                'Value': np.concatenate(df1['Value'])})
      ...:
1 loop, best of 3: 355 ms per loop

In [2276]: %%timeit
      ...: rows = []
      ...: for _, row in df1.iterrows():
      ...:     [rows.append([row['ID'], key, val]) 
                for key, val in zip(row['Key'], row['Value'])]
      ...: pd.DataFrame(rows)
      ...:
1 loop, best of 3: 1.31 s per loop

In [2277]: %timeit df1.set_index('ID').stack().apply(
                     lambda x: pd.Series(x)).unstack(0).T.reset_index()
1 loop, best of 3: 3.87 s per loop

答案 3 :(得分:0)

创建元组组合,然后使用组合构建数据框

L1 = [['ID1', ('key1a','key1b','key1c'), ('value1a','value1b','value1c')],
  ['ID2', ('key2a','key2b','key2c'), ('value2a','value2b','value2c')]]
df1 = pd.DataFrame(L1,columns=['ID','Key','Value'])
tuples=[]
for key,item in df1.iterrows():
    id=item['ID']
    for i in range(len(item['Key'])):
        key=item["Key"][i]
        value=item['Value'][i]
        tuples.append((id,key,value))
    
 df=pd.DataFrame.from_records(tuples,columns=['ID','Key','Value'])    
 print(df)

 output:
    ID    Key    Value
 0  ID1  key1a  value1a
 1  ID1  key1b  value1b
 2  ID1  key1c  value1c
 3  ID2  key2a  value2a
 4  ID2  key2b  value2b
 5  ID2  key2c  value2c