(实际输入的 CSV 通常以逗号分隔;我只是将我的想法显示为表格以便于查看。)
这是我想使用Python 2.7做的一个例子(Pandas,如果它更好/更容易,但我也喜欢学习Python逻辑,Pandas跳过了很多,尽管我可能需要学习它来完成这样的事情):来自
Price Name Text Number Choice URL Email
$40 Foo Stuff 560 Y www.a.com a@a.com
$60 Foo Things 280 N www.a.com a@a.com
$20 Foo Other 120 Y www.a.com a@a.com
$25 John Gals 1222 N www.b.com b@b.com
$100 Bar Dudes 999 Y www.c.com c@c.com
$250 Bar Guys 200 Y www.c.com c@c.com
至
Name Price1 Price2 Price3 Text1 Text2 Text3 Number1 Number2 Number3 Choice1 Choice2 Choice3 URL Email
Foo $40 $60 $20 Stuff Things Other 560 280 120 Y N Y www.a.com a@a.com
John $25 Gals 1222 N www.b.com b@b.com
Bar $100 $250 Dudes Guys 999 200 Y Y www.c.com c@c.com
尽管我通常想按名称列进行组合,但列的顺序并不重要。 (希望我的理解是正确的,因为仅仅举这个例子就很痛苦!)
为了额外加分,如果单元格为空,我希望阻止单元格填充新列:例如如果上面 From
中的第 2 行缺少 a@a.com
,则 To
看起来是一样的,不会生成“Email2”列。另外,虽然列的顺序并不重要(我使用它来填充需要 CSV 输入的数据库),但编号必须匹配!也就是说,对于任何给定的名称,例如上面的 Foo:$60、Things、280 和 N 都必须位于标记为“[OrigName]2”的列中 - 并且在任何给定标签的 column1 为空白时,不应填充 Column2。
这应该很容易,但为了完整起见,我还需要一列将填充的文本列(例如,整数列“文本数量”)相加,另一列将标记为“的“价格”数量相加免费”(例如“免费文本数量”)。
非常感谢您的帮助 - 我已经对从中学到的东西感到兴奋,并且随时欢迎进一步的阅读资源!
最佳答案
在[252]中:
import pandas as pd
import io
f = io.BytesIO("""Price Name Text Number Choice URL Email
40 Foo Stuff 560 Y www.a.com a@a.com
60 Foo Things 280 N www.a.com
20 Foo Other 120 Y www.a.com a@a.com
25 John Gals 1222 N www.b.com b@b.com
100 Bar Dudes 999 Y www.c.com c@c.com
250 Bar Guys 200 Y www.c.com c@c.com""")
df = pd.read_csv(f, delim_whitespace=True)
print df
输出:
Price Name Text Number Choice URL Email
0 40 Foo Stuff 560 Y www.a.com a@a.com
1 60 Foo Things 280 N www.a.com NaN
2 20 Foo Other 120 Y www.a.com a@a.com
3 25 John Gals 1222 N www.b.com b@b.com
4 100 Bar Dudes 999 Y www.c.com c@c.com
5 250 Bar Guys 200 Y www.c.com c@c.com
在[253]中:
split_columns = ["Price", "Text", "Number", "Choice"]
def split_func(df):
return df.set_index(np.arange(1, df.shape[0]+1))
df2 = df[split_columns].groupby(df.Name).apply(split_func).unstack()
df2.columns = [name+str(i) for name, i in df2.columns]
print df2
输出:
Price1 Price2 Price3 Text1 Text2 Text3 Number1 Number2 Number3 \
Name
Bar 100 250 NaN Dudes Guys NaN 999 200 NaN
Foo 40 60 20 Stuff Things Other 560 280 120
John 25 NaN NaN Gals NaN NaN 1222 NaN NaN
Choice1 Choice2 Choice3
Name
Bar Y Y NaN
Foo Y N Y
John N NaN NaN
在[245]中:
unique_columns = ["URL", "Email"]
def unique_func(s):
return s.dropna().unique()[0]
df3 = df[unique_columns].groupby(df.Name).agg(unique_func)
print df3
输出:
URL Email
Name
Bar www.c.com c@c.com
Foo www.a.com a@a.com
John www.b.com b@b.com
在[246]中:
print pd.merge(df2, df3, left_index=True, right_index=True)
输出:
Price1 Price2 Price3 Text1 Text2 Text3 Number1 Number2 Number3 \
Name
Bar 100 250 NaN Dudes Guys NaN 999 200 NaN
Foo 40 60 20 Stuff Things Other 560 280 120
John 25 NaN NaN Gals NaN NaN 1222 NaN NaN
Choice1 Choice2 Choice3 URL Email
Name
Bar Y Y NaN www.c.com c@c.com
Foo Y N Y www.a.com a@a.com
John N NaN NaN www.b.com b@b.com
关于python - 使用 Python 将 CSV 元素从列合并到行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802923/