考虑一个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)
答案 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.repeat
和np.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