我有一个df
包含我的主要数据,其中有一百万rows
.我的主要数据也有30个columns
.现在我想在我的df
被叫中添加另一列category
.该category
是column
在df2
其中包含约700 rows
和两个其他columns
将搭配2 columns
中df
.
我开始设置一个index
in df2
并且df
将在帧之间匹配,但是其中一些index
in df2
不存在df
.
其余的列df2
被称为AUTHOR_NAME
和CATEGORY
.
df
调用相关列AUTHOR_NAME
.
一些AUTHOR_NAME
in df
不存在,df2
反之亦然.
我要的指令是:当index
在df
同场比赛index
中df2
,并title
在df
同场比赛title
中df2
,添加category
到df
,否则在加的NaN category
.
示例数据: …
也许这是一个愚蠢的(实际上并不是很实际的)问题,但我问它是因为我无法绕过它.
在研究return
调用上下文管理器中的语句是否会阻止__exit__
被调用时(不是没有),我发现在块之间__exit__
和块之间进行类比似乎很常见(例如:https:// stackoverflow .com/a/9885287/3471881)因为:finally
try/finally
def test():
try:
return True
finally:
print("Good bye")
Run Code Online (Sandbox Code Playgroud)
将执行相同的:
class MyContextManager:
def __enter__(self):
return self
def __exit__(self, *args):
print('Good bye')
def test():
with MyContextManager():
return True
Run Code Online (Sandbox Code Playgroud)
这真的帮助我理解cm:s是如何工作的,但是在玩了一下之后我意识到如果我们返回的东西而不是打印,这个类比就不会起作用.
def test():
try:
return True
finally:
return False
test()
--> False
Run Code Online (Sandbox Code Playgroud)
虽然__exit__
看似根本不会回归:
class MyContextManager:
def __enter__(self):
return self
def __exit__(self, *args):
return False
def test():
with MyContextManager():
return True
test()
--> True
Run Code Online (Sandbox Code Playgroud)
这让我想到也许你实际上不能归还任何东西__exit__
,但你可以:
class MyContextManager: …
Run Code Online (Sandbox Code Playgroud) 我想组使用SQL或R我的数据,这样我可以得到的顶部或底部10 Subarea_codes
每个Company
和Area_code
.从本质上说:在Subarea_codes
该范围内Area_codes
,每个Company
都有其最大或最小的结果.
data.csv
Area_code Subarea_code Company Result
10 101 A 15
10 101 P 10
10 101 C 4
10 102 A 10
10 102 P 8
10 102 C 5
11 111 A 15
11 111 P 20
11 111 C 5
11 112 A 10
11 112 P 5
11 112 C 10
result.csv should be like this
Company Area_code Largest_subarea_code Result Smallest_subarea_code Result
A 10 101 …
Run Code Online (Sandbox Code Playgroud) 这个问题与@jpp:s在将具有类似名称约定的文件合并到数据框中的答案以及标记早期线程(将csv文件放在单独的数据帧中取决于文件名)作为重复的决定有关,因为该线程中的三个答案是要么不工作(2/3)要么不工作(1/3).
忽略那些无法解决的答案,一个答案(我的回答)据说质量很差,因为" concat
在文档中明确不建议使用for循环".
批评的方法:
dataframes = {}
for filename in filenames:
_df = pd.read_csv(filename)
key = filename[:3]
try:
dataframes[key] = pd.concat([dataframes[key], _df], ignore_index=True)
except KeyError:
dataframes[key] = _df
Run Code Online (Sandbox Code Playgroud)
接受的方法(dd
是一个字典,其中每个值是文件名列表,每个键是每个文件名的前三个字符):
dict_of_dfs
for k, v in dd.items():
dict_of_dfs[k] = pd.concat([pd.read_csv(fn) for fn in v], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)
现在我同意concat
调用中的列表理解(接受的方法)比每个调用的for循环更有效.concat
DataFrame
但这是否意味着我们应该总是DataFrames
通过在concat
调用(或append
)中使用列表推导来创建多个数据源,并且使用for循环是如此之差以至于它实际上是错误的?可读性怎么样?我个人(当然)认为我批评的方法更具可读性.
如果我们阅读pandas
文档,DataFrame.append
我们就会知道for循环或列表理解都不是"推荐的生成DataFrames的方法": …